Eu tenho um servidor nginx que atende quase meia dúzia de sites diferentes. Ele está sendo executado em um Linode que acabou de receber suporte nativo ao IPv6 (data center de Dallas) e estou tentando configurar a maioria dos meus sites para operação com pilha dupla. Coloquei o primeiro em funcionamento usando um subdomínio somente IPv6, da seguinte forma:
server {
listen [::]:80 ipv6only=on;
listen 80;
server_name example.com ipv6.example.com;
root /var/www/example.com/htdocs;
#More stuff, including PHP, WordPress
}
Isso funciona muito bem - example.com é somente IPv4 (por enquanto) e ipv6.example.com é apenas IPv6 (principalmente para fins de teste). Eu posso ping6 ipv6.example.com
, e mesmo wget ipv6.example.com
sem suar a camisa - isso foi agradavelmente indolor (depois de encontrar a "pegadinha" com a maneira como o nginx liga os hosts virtuais, exigindo o ipv6only=on
argumento e as duas listen
diretrizes).
No entanto, agora estou tentando expandir isso para dar suporte aos meus outros domínios, começando com static.example.com; embora eu adote a mesma abordagem acima (as listen
diretivas duplas , incluindo o ipv6only=on
argumento), recebo o seguinte erro ao reiniciar o nginx:
* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
Parece que talvez o método de ligação do nginx para IPv6 não permita hosts virtuais baseados em nome? Terei que obter endereços IPv6 adicionais do meu host (não é um problema) e usar a hospedagem virtual baseada em IP no IPv6 com a hospedagem virtual baseada em nome no IPv4? Ou estou faltando uma solução que permita que minhas configurações permaneçam consistentes nas duas pilhas?
Eu esperava ter meu site totalmente na pilha do IPv6 a tempo do Dia Mundial do IPv6 , mas, a menos que eu possa esclarecer isso rapidamente, talvez não esteja pronto. Não é grande coisa do ponto de vista prático - nenhum dos meus sites se qualifica como "grande organização" por qualquer extensão da imaginação - mas ajude-me a economizar meu crédito nerd!
Editado para adicionar:
Graças à resposta de @kolbyjack, agora tenho um servidor da Web com pilha dupla totalmente funcional. Por uma questão de clareza, estou editando a solução que ele me deu para que todos possam ver claramente qual é a resposta.
Meu vhost catchall padrão possui as seguintes listen
diretivas:
listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;
Não sei se a ordem importa, mas aí está. Em seguida, cada vhost adicional possui as seguintes listen
diretivas:
listen 80;
listen [::]:80;
(Ou 8080 para o que escuta nessa porta.) A parte importante aqui parece ser a total falta de argumentos adicionais em todas as listen
diretivas padrão do vhost, exceto as diretivas padrão do vhost - ou seja, nenhuma repetição de ipv6only=on
.
Mais uma vez, muito obrigado a @kolbyjack pela solução aqui!
fonte
ipv6only=on
. Tudo o resto permaneceu o mesmo, no entanto, obrigado por isso!Respostas:
Você só precisa de opções de escuta em uma declaração para um soquete. Geralmente você os colocaria na declaração que também inclui o sinalizador default_server, mas para algumas opções, acho que você pode configurá-los em qualquer diretiva de escuta. Apenas remova o ipv6only = on de todas as escutas, exceto uma.
fonte
ipv6only=on
está listado apenas (para cada porta em que escuto) no meu vhost padrão (ao ladodefault_server
); cada vhost simplesmente especificalisten 80;
elisten [::]:80
(sem parâmetros adicionais) funcionar no IPv4 e no IPv6. Agora tudo o que tenho a fazer é terminar de adicionar os registros AAAA para meus domínios de pilha dupla, e eu devo estar aqui. Obrigado!