Nginx não gera tanto trabalhadores ipv4 quanto ipv6

2

Edição posterior Depois de muita solução de problemas, o problema real acabou sendo um ponto-e-vírgula ausente após a diretiva server_name . nginx -t -c /etc/nginx/nginx.conf não estava pegando. Verifique novamente se há algum erro semelhante a esse caso.

A pergunta original é a seguinte:

Eu estou no processo de configurar um novo servidor construído no Ubuntu 16.04 usando o nginx 1.10.0.

A questão específica é que, enquanto a minha nova configuração corresponde essencialmente à minha antiga configuração nginx de um servidor do Ubuntu 13.10 usando o nginx 1.4.4, o nginx 1.10.0 está apenas criando trabalhadores ipv4 ou ipv6, mas não ambos. Esse comportamento não está presente no servidor antigo. Não tenho certeza do que mais tentar neste momento.

Eu verifiquei que minha instalação do nginx foi criada com o 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

Abaixo estão minhas configurações atuais para o novo servidor:

# /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/*;
}

E eu tenho um único site habilitado no momento para testes. Eu terei vários vhosts configurados eventualmente.

# /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;
  }
}
Por último, o estranho é se os trabalhadores se ligam ao ipv4 ou ipv6 depende inteiramente da ordem em que as diretivas listen são colocadas. Nos dados a seguir, mudei o pedido e tentei várias configurações várias vezes. Após cada alteração para /etc/nginx/sites-enabled/blog , fiz sudo service nginx stop; sudo service nginx start; sudo lsof -i; para obter os dados.

Observe também que mudei a contagem de funcionários para 8 após executar essas etapas. No entanto, enquanto o número de trabalhadores aumentou, o mesmo comportamento foi observado onde todos os trabalhadores eram ou ipv4 ou 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)
    
por Geuis 26.07.2016 / 01:16

2 respostas

3

Parece que sua configuração padrão para ipv6only é diferente. Na maioria dos sistemas operacionais, você pode criar soquetes IPv6 que também aceitam conexões IPv4, de modo que você só precisa de um soquete (uma diretiva de escuta).

Parece que no seu antigo servidor usou ipv6only=on , então você criou um soquete IPv4 e um IPv6. Em seu novo servidor, o padrão é ipv6only=off , o que faz com que o soquete IPv6 também ouça o IPv4. E isso cria um conflito com o soquete IPv4 separado. Se você remover a linha de escuta do IPv4, ela provavelmente funcionará apenas com os dois protocolos.

Para tornar as coisas previsíveis, é melhor definir explicitamente o sinalizador ipv6only e usar um destes:

listen 80;
listen [::]:80 ipv6only=on;

ou

listen [::]:80 ipv6only=off;
    
por 26.07.2016 / 09:18
2

Então eu finalmente consegui resolver isso, mas não de qualquer maneira que eu já vi descrito em outro lugar.

Eu configurei "net.ipv6.bindv6only = 1" em /etc/sysctl.conf e recarreguei via "sudo sysctl -p". Então, com a configuração na diretiva do servidor, "listen 80; listen [::]: 80;" Eu agora tenho meus funcionários divididos igualmente entre ipv4 e ipv6 e agora eu posso conectar a partir de qualquer fonte ip.

Adicione a /etc/sysctl.conf e recarregue com "sudo sysctl -p":

net.ipv6.bindv6only = 1

Exemplo de configuração do 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;
  }
}

Recarregar nginx

sudo service nginx reload

Então "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)

Confirme com "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      -
    
por 26.07.2016 / 23:25

Tags