Nginx использует IPv6 в proxy pass, даже если он отключен
Добрый день, На сервере отключен IPv6. На nginx настроено проксирование на upstream c поддержкой IPv4 и IPv6. Nginx периодически (раз в 5 секунд) пытается отправлять запросы на IPv6 и соответственно обламывается с ошибками: 2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to [::C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: "GET /download/file HTTP/1.0", upstream: "https://[::C:DDD:E:F:GGG:HHH]:443/download/file";, host: "example.com" Как можно отключить IPv6 для proxy_pass? # nginx.conf: upstream download { server download.example.com:443; keepalive 8; } location /download { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ""; proxy_ignore_headers X-Accel-Redirect; proxy_http_version1.1; resolver 8.8.8.8; resolver_timeout 5s; proxy_passhttps://download; } nginx -V: nginx version: nginx/1.4.2 built by gcc 4.7.2 (Debian 4.7.2-5) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_spdy_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,-z,relro --with-ipv6 uname -a: Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241403,241403#msg-241403 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
On Wed, Jul 31, 2013 at 04:06:27AM -0400, Antohat wrote: > Добрый день, > > На сервере отключен IPv6. На nginx настроено проксирование на upstream c > поддержкой IPv4 и IPv6. > > Nginx периодически (раз в 5 секунд) пытается отправлять запросы на IPv6 и > соответственно обламывается с ошибками: > > 2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to > [::C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while > connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: > "GET /download/file HTTP/1.0", upstream: > "https://[::C:DDD:E:F:GGG:HHH]:443/download/file";, host: > "example.com" > > Как можно отключить IPv6 для proxy_pass? Как-то заставить системный resolver(3) не возвращать IPv6-адреса (ответы типа ) для хоста, на котором отключен IPv6. Попробуйте добиться желаемого эффекта с командой telnet download.example.com Или же использовать IPv4-адреса в конфигурации nginx. Кстати, в приведенной конфигурации директива resolver не нужна. > # nginx.conf: > upstream download { > server download.example.com:443; > keepalive 8; > } > > location /download { > proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; > proxy_set_header Connection ""; > proxy_ignore_headers X-Accel-Redirect; > proxy_http_version1.1; > resolver 8.8.8.8; > resolver_timeout 5s; > proxy_passhttps://download; > } > > nginx -V: > nginx version: nginx/1.4.2 > built by gcc 4.7.2 (Debian 4.7.2-5) > TLS SNI support enabled > configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx > --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log > --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid > --lock-path=/var/run/nginx.lock > --http-client-body-temp-path=/var/cache/nginx/client_temp > --http-proxy-temp-path=/var/cache/nginx/proxy_temp > --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp > --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp > --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx > --with-http_ssl_module --with-http_realip_module --with-http_addition_module > --with-http_sub_module --with-http_dav_module --with-http_flv_module > --with-http_mp4_module --with-http_gunzip_module > --with-http_gzip_static_module --with-http_random_index_module > --with-http_secure_link_module --with-http_stub_status_module --with-mail > --with-mail_ssl_module --with-file-aio --with-http_spdy_module > --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat > -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,-z,relro > --with-ipv6 > > uname -a: > Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux > > Posted at Nginx Forum: > http://forum.nginx.org/read.php?21,241403,241403#msg-241403 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
31.07.2013 14:06, Antohat пишет: Добрый день, На сервере отключен IPv6. На nginx настроено проксирование на upstream c поддержкой IPv4 и IPv6. Nginx периодически (раз в 5 секунд) пытается отправлять запросы на IPv6 и соответственно обламывается с ошибками: 2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to [::C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: "GET /download/file HTTP/1.0", upstream: "https://[::C:DDD:E:F:GGG:HHH]:443/download/file";, host: "example.com" Как можно отключить IPv6 для proxy_pass? # nginx.conf: upstream download { server download.example.com:443; keepalive 8; } location /download { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ""; proxy_ignore_headers X-Accel-Redirect; proxy_http_version1.1; resolver 8.8.8.8; resolver_timeout 5s; proxy_passhttps://download; } nginx -V: nginx version: nginx/1.4.2 built by gcc 4.7.2 (Debian 4.7.2-5) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_spdy_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,-z,relro --with-ipv6 uname -a: Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241403,241403#msg-241403 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Вы используете ipv6? Если нет - попробуйте отключить его в системе. Выполните: sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1 sysctl -w net.ipv6.conf.lo.disable_ipv6=1 и перезапустив nginx попробуйте воспроизвести ошибку. Если ошибка не воспроизведется - добавьте в /etc/sysctl.conf это: net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
Ruslan Ermilov Wrote: --- > Как-то заставить системный resolver(3) не возвращать IPv6-адреса > (ответы > типа ) для хоста, на котором отключен IPv6. Попробуйте добиться > желаемого эффекта с командой > > telnet download.example.com Не уверен, что так можно сделать... Может быть было бы правильнее, чтобы nginx определял, что IPv6 не настроен и не пытался использовать записи ? По крайней мере такой параметр в конфиге точно не был бы лишним. > Или же использовать IPv4-адреса в конфигурации nginx. Кстати, в > приведенной конфигурации директива resolver не нужна. К сожалению не можем, т.к. IP апстрима могут меняться без предварительного уведомления. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241405,241407#msg-241407 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
Raven_kg Wrote: --- > Вы используете ipv6? Если нет - попробуйте отключить его в системе. > Выполните: > sysctl -w net.ipv6.conf.all.disable_ipv6=1 > sysctl -w net.ipv6.conf.default.disable_ipv6=1 > sysctl -w net.ipv6.conf.lo.disable_ipv6=1 > > и перезапустив nginx попробуйте воспроизвести ошибку. Если ошибка не > воспроизведется - добавьте в /etc/sysctl.conf это: > net.ipv6.conf.all.disable_ipv6 = 1 > net.ipv6.conf.default.disable_ipv6 = 1 > net.ipv6.conf.lo.disable_ipv6 = 1 > У нас уже была установлена опция net.ipv6.conf.all.disable_ipv6=1 Добавление net.ipv6.conf.default.disable_ipv6=1 и net.ipv6.conf.lo.disable_ipv6=1 не помогает. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241406,241408#msg-241408 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
On Wed, Jul 31, 2013 at 06:10:55AM -0400, Antohat wrote: > Ruslan Ermilov Wrote: > --- > > Как-то заставить системный resolver(3) не возвращать IPv6-адреса > > (ответы > > типа ) для хоста, на котором отключен IPv6. Попробуйте добиться > > желаемого эффекта с командой > > > > telnet download.example.com > Не уверен, что так можно сделать... > Может быть было бы правильнее, чтобы nginx определял, что IPv6 не настроен и > не пытался использовать записи ? Что ж бедному nginx, на каждый чих это проверять? Ведь сейчас может быть не настроен, а через минуту уже настроен. > По крайней мере такой параметр в конфиге точно не был бы лишним. А ещё хорошо иметь настройку в nginx.conf, которая проверяет, что утюг дома не забыли выключить. :) > > Или же использовать IPv4-адреса в конфигурации nginx. Кстати, в > > приведенной конфигурации директива resolver не нужна. > К сожалению не можем, т.к. IP апстрима могут меняться без предварительного > уведомления. Ну соберите nginx без --with-ipv6, и будет вам счастье. ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
топикстартеру: если резолвер под вашим управлением, то, возможно, поможет следующее обсуждение: http://comments.gmane.org/gmane.network.dns.operations/1538 -- boco ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
31.07.2013 16:10, Antohat пишет: Ruslan Ermilov Wrote: --- Как-то заставить системный resolver(3) не возвращать IPv6-адреса (ответы типа ) для хоста, на котором отключен IPv6. Попробуйте добиться желаемого эффекта с командой telnet download.example.com Не уверен, что так можно сделать... Может быть было бы правильнее, чтобы nginx определял, что IPv6 не настроен и не пытался использовать записи ? По крайней мере такой параметр в конфиге точно не был бы лишним. Или же использовать IPv4-адреса в конфигурации nginx. Кстати, в приведенной конфигурации директива resolver не нужна. К сожалению не можем, т.к. IP апстрима могут меняться без предварительного уведомления. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241405,241407#msg-241407 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Заюзайте резольвер не поддерживающий . ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
Ruslan Ermilov Wrote: > Что ж бедному nginx, на каждый чих это проверять? Ведь сейчас > может быть не настроен, а через минуту уже настроен. Проксирование на домен (без апстрима) вроде бы работает корректно (по крайней мере ошибки в лог больше не пишутся). Т.е. не такая уж это большая проблема, определять поддержку IPv6. С распространением IPv6 описанная в топике проблема, когда апстрим поддерживает IPv6, а сервер с Nginx'ом нет, будет все более актуальна. Проблема конечно решается самостоятельной сборкой nginx, но это решение не соответствует стратегии более широкого распространения продукта. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241405,241444#msg-241444 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
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@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
On Wed, Jul 31, 2013 at 04:06:27AM -0400, Antohat wrote: > Добрый день, > > На сервере отключен IPv6. На nginx настроено проксирование на upstream c > поддержкой IPv4 и IPv6. > > Nginx периодически (раз в 5 секунд) пытается отправлять запросы на IPv6 и > соответственно обламывается с ошибками: > > 2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to > [::C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while > connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: > "GET /download/file HTTP/1.0", upstream: > "https://[::C:DDD:E:F:GGG:HHH]:443/download/file";, host: > "example.com" > > Как можно отключить IPv6 для proxy_pass? http://hg.nginx.org/nginx/rev/ec8594b9bf11 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru