Re: Множество server { listen } с одним IPv6

Maxim Dounin mdounin на mdounin.ru
Чт Мар 15 08:17:02 UTC 2012


Hello!

On Thu, Mar 15, 2012 at 03:50:20AM -0400, Spoofing wrote:

> Теперь, с IPv6 нельзя повешать на один IP
> несколько хостов, как это можно делать
> с IPv4?

Можно.

> простой пример, как делал обычно:
> server { listen 80; server_name example.com } # для
> редиректа на www.
> server { listen 80; server_name www.example.com } #
> "нормальный" сайт
> server { listen 80 default_server; } # для всего
> остального
> 
> по-умолчанию просто listen 80 не слушает ipv6,
> и обязательно пишем [::], окей:
> server { listen [::]:80; server_name example.com } # для
> редиректа на www.
> server { listen [::]:80; server_name www.example.com } #
> "нормальный" сайт
> server { listen [::]:80 default_server; } # для всего
> остального
> 
> но - не работает.
> 
> Вот элементаро, listen 0.0.0.0:80 разрешает
> слушать сокет сколько угодно раз в
> разных server { }, а listen [::]:80 всего один раз в
> server { }, а потом ошибка:
> 2012/03/14 19:22:12 [emerg] 18692#0: bind() to [::]:80 failed (98:
> Address already in use)

Должно работать.

Если это linux, то обычно всё ломается уже при одном "listen 
[::]:80", но проблема там не в том что два "[::]:80" нельзя, а в 
том, что "[::]:80" неявно включает в себя ipv4 listen на 80-м 
порту, и он конфликтует с "listen 80" в других частях конфига.  
Решение - написать "ipv6only=yes" явно:

    listen [::]:80 ipv6only=yes;

Если не работает - приносите nginx -V и полный конфиг с которым 
воспроизводится.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru