ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Nginx использует IPv6 в proxy pass, даже если он отключен



On Thu, Aug 01, 2013 at 04:13:32AM -0400, Antohat wrote:
> Ruslan Ermilov Wrote:
> > Что ж бедному nginx, на каждый чих это проверять?  Ведь сейчас
> > может быть не настроен, а через минуту уже настроен.
> 
> Проксирование на домен (без апстрима) вроде бы работает корректно (по
> крайней мере ошибки в лог больше не пишутся). Т.е. не такая уж это большая
> проблема, определять поддержку IPv6.

Вы имеете в виду вариант proxy_pass http://download.exmaple.com ?
Если да, та разницы никакой нет.

В этом случае все IP-адреса (включая IPv6) будут также определены
единожды на этапе чтения конфигурации, после чего все адреса будут
использоваться в режиме round-robin, как и документировано [1]:

: Если доменному имени соответствует несколько адресов, то
: все они будут использоваться по очереди (round-robin).
: Кроме того, в качестве адреса можно указать группу серверов. 

[1] http://nginx.org/r/proxy_pass/ru

Вот живой пример:

    server {
        location / {
            proxy_pass http://lo0.su;
        }
    }

Из error_log'а, запросы раз в секунду:

2013/08/01 11:05:22 [error] 12561#0: *3 connect() to [2a01:4f8:a0:1064::2]:80 
failed (101: Network is unreachable) while connecting to upstream, client: 
127.0.0.1, server: , request: "HEAD / HTTP/1.1", upstream: 
"http://[2a01:4f8:a0:1064::2]:80/";, host: "127.0.0.1:8000"
2013/08/01 11:05:35 [error] 12561#0: *30 connect() to [2a01:4f8:a0:1064::2]:80 
failed (101: Network is unreachable) while connecting to upstream, client: 
127.0.0.1, server: , request: "HEAD / HTTP/1.1", upstream: 
"http://[2a01:4f8:a0:1064::2]:80/";, host: "127.0.0.1:8000"
2013/08/01 11:05:48 [error] 12561#0: *55 connect() to [2a01:4f8:a0:1064::2]:80 
failed (101: Network is unreachable) while connecting to upstream, client: 
127.0.0.1, server: , request: "HEAD / HTTP/1.1", upstream: 
"http://[2a01:4f8:a0:1064::2]:80/";, host: "127.0.0.1:8000"

То есть 1-й запрос идёт на IPv4-адрес, 2-й - на IPv6, далее начинает
действовать max_fails=1 и fail_timeout=10 для неявных апстримов и
IPv6-адрес временно не используется, спустя ~10 секунд снова пробный
запрос на IPv6, и т.д.

nginx version: nginx/1.4.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
configure arguments: --with-debug --with-ipv6

> С распространением IPv6 описанная в топике проблема, когда апстрим
> поддерживает IPv6, а сервер с Nginx'ом нет, будет все более актуальна.

Проблема, если она и есть, не в nginx.  Ваш nginx собран с поддержкой
IPv6, значит при резолвинге имён, как и любая другая прикладная
программа, он получает и IPv4-, и IPv6-адреса.

> Проблема конечно решается самостоятельной сборкой nginx, но это решение не
> соответствует стратегии более широкого распространения продукта.

Не существует универсального способа узнать, что на системе
выключен IPv6.  Кроме того, выключенность IPv6 - это не постоянное
состояние.

Не возвращать IPv6-адреса при резолвинге имён, если в системе не
сконфигурирован IPv6, это в общем случае неправильное поведение.
С другой стороны, во многих прикладных программах доступны опции
командной строки -4 и -6, которые заставляют программу использовать
только IPv4- или только IPv6-адреса.  Я подумаю в эту сторону.

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.