Позже править После БОЛЬШОГО устранения неполадок фактическая проблема оказалась отсутствующей точкой с запятой после server_name
директива. nginx -t -c /etc/nginx/nginx.conf
не улавливал. Перепроверьте, нет ли опечаток, если вы когда-нибудь сталкивались с подобным случаем.
Исходный вопрос следует ниже:
Я занимаюсь настройкой нового сервера, построенного на ubuntu 16.04, с использованием nginx 1.10.0.
Конкретная проблема заключается в том, что, хотя моя новая конфигурация по существу соответствует моей старой конфигурации nginx с сервера ubuntu 13.10 с использованием nginx 1.4.4, nginx 1.10.0 создает только рабочих ipv4 или ipv6, но не обоих одновременно. Такого поведения нет на старом сервере. Не знаю, что еще попробовать на этом этапе.
Я убедился, что моя установка nginx была построена с использованием ipv6.
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g-fips 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
Ниже приведены мои текущие конфигурации для нового сервера:
# /etc/nginx/nginx.conf
user www-data;
worker_rlimit_nofile 30000;
worker_processes 8;
pid /run/nginx.pid;
events {
worker_connections 500000;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
И у меня сейчас включен только один сайт для тестирования. В конце концов, я настрою несколько хостов.
# /etc/nginx/sites-enabled/blog
server {
server_name test.bloggyblog.com
listen 80;
listen [::]:80;
root /usr/local/apps/blog;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Наконец, странно то, привязываются ли рабочие к ipv4 или ipv6, полностью зависит от порядка, в котором listen
размещены директивы. В следующих данных я поменял порядок и несколько раз пробовал разные конфигурации. После каждого изменения на /etc/nginx/sites-enabled/blog
я сделал sudo service nginx stop; sudo service nginx start; sudo lsof -i;
чтобы получить данные.
Также обратите внимание, что после выполнения этих шагов я изменил счетчик рабочих на 8. Однако, хотя количество рабочих увеличивалось, такое же поведение наблюдалось, когда все рабочие были либо ipv4, либо ipv6.
listen [::]:80;
listen 80;
nginx 27675 root 6u IPv4 204423 0t0 TCP *:http (LISTEN)
nginx 27676 www-data 6u IPv4 204423 0t0 TCP *:http (LISTEN)
listen 80;
listen [::]:80;
nginx 27747 root 6u IPv6 205134 0t0 TCP *:http (LISTEN)
nginx 27748 www-data 6u IPv6 205134 0t0 TCP *:http (LISTEN)
listen 80;
listen [::]:80 default ipv6only=on;
nginx 27819 root 6u IPv6 205849 0t0 TCP *:http (LISTEN)
nginx 27820 www-data 6u IPv6 205849 0t0 TCP *:http (LISTEN)
listen 80;
listen [::]:80 default ipv6only=off;
nginx 27885 root 6u IPv6 206495 0t0 TCP *:http (LISTEN)
nginx 27886 www-data 6u IPv6 206495 0t0 TCP *:http (LISTEN)
listen 80;
listen [::]:80 default;
nginx 27953 root 6u IPv6 207184 0t0 TCP *:http (LISTEN)
nginx 27954 www-data 6u IPv6 207184 0t0 TCP *:http (LISTEN)
Похоже, ваша настройка по умолчанию для ipv6only
отличается. В большинстве операционных систем вы можете создавать сокеты IPv6, которые также принимают соединения IPv4, поэтому вам нужен только один сокет (одна директива прослушивания).
Похоже, что на вашем старом сервере он использовал ipv6only=on
Итак, вы создали как сокет IPv4, так и сокет IPv6. На вашем новом сервере по умолчанию ipv6only=off
, что позволяет сокету IPv6 также прослушивать IPv4. И это создает конфликт с отдельным сокетом IPv4. Если вы удалите строку прослушивания IPv4, она, вероятно, будет работать с обоими протоколами.
Чтобы сделать вещи предсказуемыми, вероятно, лучше явно установить ipv6only
flag и используйте один из них:
listen 80;
listen [::]:80 ipv6only=on;
или
listen [::]:80 ipv6only=off;
Итак, я, наконец, смог решить эту проблему, но не видел описанного в другом месте.
Я установил net.ipv6.bindv6only = 1 в /etc/sysctl.conf и перезагрузил его через sudo sysctl -p. Затем с конфигурацией в директиве сервера "слушайте 80; слушайте [::]: 80;" Теперь мои рабочие распределены поровну между ipv4 и ipv6, и теперь я могу подключаться из любого источника ip.
Добавьте в /etc/sysctl.conf и перезагрузите с помощью "sudo sysctl -p":
net.ipv6.bindv6only = 1
Пример конфигурации nginx:
server {
server_name test.bloggyblog.com
listen 80;
listen [::]:80;
root /usr/local/apps/blog;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Перезагрузить nginx
sudo service nginx reload
Затем "sudo lsof -i"
nginx 2096 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2096 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2097 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2097 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2098 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2098 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2099 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2099 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2100 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2100 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2101 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2101 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2102 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2102 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
nginx 2103 www-data 6u IPv4 286321 0t0 TCP *:http (LISTEN)
nginx 2103 www-data 7u IPv6 286322 0t0 TCP *:http (LISTEN)
Подтвердите с помощью "netstat -tlp"
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:http *:* LISTEN -
tcp6 0 0 [::]:http [::]:* LISTEN -