hosts virtuais baseados em nome nginx no IPv6

44

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 a IPv6 (data center de Dallas) e estou tentando configurar a maioria dos meus sites para operação de pilha dupla. Eu consegui 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 é apenas IPv4 (por enquanto) e ipv6.example.com é somente IPv6 (principalmente para fins de teste). Eu posso ping6 ipv6.example.com , e mesmo wget ipv6.example.com sem quebrar o suor - isso foi agradavelmente livre de dor (depois de encontrar o "gotcha" com a maneira como o nginx liga hosts virtuais, necessitando o argumento ipv6only=on e o dual listen diretivas).

No entanto, estou tentando expandir isso para oferecer suporte a meus outros domínios, começando com static.example.com; No entanto, quando adoto a mesma abordagem acima (as diretivas listen do dual, incluindo o argumento ipv6only=on ), 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 o IPv6 não permita hosts virtuais baseados em nomes? Terei que obter endereços IPv6 adicionais do meu host (não um problema) e usar hospedagem virtual baseada em IP no IPv6 com hospedagem virtual baseada em nome em IPv4? Ou estou perdendo uma solução que permitirá que minhas configurações permaneçam consistentes nas duas pilhas?

Eu esperava ter meu site totalmente na pilha do IPv6 a tempo para o Dia Mundial do IPv6 , mas a menos que eu possa esclarecer isso rapidamente eu posso não estar pronto. Não é grande coisa do ponto de vista prático - nenhum dos meus sites se qualifica como uma "grande organização" em qualquer extensão da imaginação - mas me ajude a salvar minha credibilidade!

Editado para adicionar:

Graças à resposta do @kolbyjack, agora tenho um servidor web de duas camadas totalmente funcional. Apenas 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 tem as seguintes listen diretivas:

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

Eu não sei se a ordem é importante, mas aí está. Em seguida, cada vhost adicional tem as seguintes diretivas listen :

listen 80;
listen [::]:80;

(Ou 8080 para aquele que ouve naquela porta.) A parte importante aqui parece ser a total falta de argumentos adicionais em todas as diretivas listen do vhost padrão - isto é, nenhuma repetição de ipv6only=on .

Mais uma vez, muito obrigado ao @kolbyjack pela solução aqui!

    
por Kromey 07.06.2011 / 01:40

1 resposta

46

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 flag default_server, mas para algumas opções, eu acho que você pode simplesmente configurá-las em qualquer diretiva de escuta. Apenas remova o ipv6only = on de todos os ouvintes, exceto um.

    
por 07.06.2011 / 04:12