Re: Nginx использует IPv6 в proxy pass, даже если он отключен
Ruslan Ermilov
ru at nginx.com
Thu Aug 1 09:39:31 UTC 2013
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