Eu vi vários exemplos de configuração para lidar com hosts virtuais IPv4 e IPv6 de pilha dupla no nginx. Muitos sugerem este padrão:
listen 80;
listen [::]:80 ipv6only=on;
Tanto quanto eu posso ver, isso atinge exatamente a mesma coisa que:
listen [::]:80 ipv6only=off;
Por que você usaria o primeiro? A única razão que posso pensar é se você precisar de parâmetros adicionais específicos para cada protocolo, por exemplo, se você quiser apenas definir deferred
IPv4.
Se você hospedar vários domínios vhost com uma única instância Nginx, não poderá usar a diretiva de escuta combinada única
para cada um deles. O Nginx tem uma peculiaridade estranha em que você só pode especificar o
ipv6only
parâmetro uma vez para cada porta ou falhará ao iniciar. Isso significa que você não pode especificá-lo para cada bloco de servidor de domínio vhost.Como Michael mencionou, a partir do Nginx 1.3.4, o
ipv6only
parâmetro padrão éon
.Portanto, se você deseja hospedar vários domínios em IPv4 e IPv6 com um único servidor Nginx, é forçado a usar duas diretivas de escuta para cada bloco de servidor de domínio:
Além disso, como Sander mencionou, o uso
ipv6only=off
tem a desvantagem de que os endereços IPv4 são convertidos em IPv6. Isso pode causar problemas se seu aplicativo fizer verificação de IP em listas negras como Akismet ou StopForumSpam porque, a menos que você crie uma camada de tradução reversa, seu aplicativo verificará a tradução IPv6 do endereço IPv4 do spammer, que não corresponderá a nenhum dos endereços IPv4 em a lista negra.Essa provavelmente é a única razão pela qual você usaria a construção anterior, atualmente.
A razão pela qual você está vendo isso é provavelmente porque o padrão
ipv6only
mudou no nginx 1.3.4. Antes disso, o padrão eraoff
; nas versões mais recentes, o padrão éon
.Isso acontece para interagir com a opção de soquete IPV6_V6ONLY no Linux e opções semelhantes em outros sistemas operacionais, cujos padrões não são necessariamente previsíveis. Portanto, a construção anterior era necessária antes da versão 1.3.4 para garantir que você estivesse realmente ouvindo conexões em IPv4 e IPv6.
A alteração no padrão nginx para
ipv6only
garante que o padrão do sistema operacional para soquetes de pilha dupla seja irrelevante. Agora, o nginx se liga explicitamente ao IPv4, IPv6 ou ambos, nunca dependendo do sistema operacional para criar um soquete de pilha dupla por padrão.De fato, minhas configurações nginx padrão para pré-1.3.4 têm a primeira configuração e pós-1.3.4 têm a segunda configuração.
No entanto, como vincular um soquete de pilha dupla é algo exclusivo do Linux, minhas configurações atuais agora se parecem mais com o primeiro exemplo, mas sem
ipv6only
definir, a saber:Com o
ipv6only=off
estilo de configuração, os endereços IPv4 podem ser mostrados como endereços IPv6 usando os endereços IPv4 mapeados para IPv4 (somente software) em, por exemplo, arquivos de log, variáveis de ambiente (REMOTE_ADDR) etc.No meu entendimento (e de acordo com os documentos em http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), usar apenaslisten 80;
é suficiente se você deseja canalizar o tráfego IPv4 e IPv6 na mesma porta.Resposta revisada em novembro de 2021
A partir de novembro de 2021 com o Nginx mais recente (do repositório oficial), por exemplo, no Ubuntu 18.04 ou 20.04, posso confirmar que, para vhosts Nginx regulares (= não o padrão), isso é o que funciona para o tráfego IPv4 e IPv6:
listen [::]:80;
...e se você usar um bloco separado para tráfego HTTPS:
listen [::]:443 ssl http2;
O
ipv6only=off
sinalizador deve ser referenciado APENAS uma vez e no vhost "padrão" no Nginx (aquele usado pelo Nginx quando nenhum domínio pode ser mapeado para um vhost).Por exemplo:
Obviamente, se a configuração do Nginx usar um único vhost, você precisará apenas da última configuração.
Um problema incômodo que encontrei ao adicionar suporte a IPv6 a um site com o
listen [::]:80 ipv6only=off;
snippet foi quando o adicionei a um vhost e o default_server já estava configurado para escutar ambos80
e[::]:80
.nginx
recusou-se a iniciar, reclamando que o endereço já estava em uso!Substituir a magia pelas duas linhas
listen [::]:80 ipv6only=off;
tradicionais permite começar bem.listen
nginx
Tanto quanto
listen [::]:80 ipv6only=off;
pode ser conveniente na configuração manual, pode causar problemas desagradáveis quando usado em sistemas de configuração automatizada.