web-dev-qa-db-fra.com

hôtes virtuels basés sur le nom nginx sur IPv6

J'ai un serveur nginx qui dessert près d'une demi-douzaine de sites Web différents. Il fonctionne sur un Linode qui vient de recevoir une prise en charge native IPv6 (centre de données de Dallas), et j'essaie de configurer la plupart de mes sites pour un fonctionnement à double pile. J'ai installé le premier en utilisant un sous-domaine IPv6 uniquement comme ceci:

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
}

Cela fonctionne très bien - example.com est uniquement IPv4 (pour l'instant), et ipv6.example.com est uniquement IPv6 (principalement à des fins de test). Je peux ping6 ipv6.example.com, et même wget ipv6.example.com sans transpirer - cela a été agréablement indolore (après avoir trouvé le "gotcha" avec la façon dont nginx lie les hôtes virtuels, nécessitant le ipv6only=on et les deux directives listen).

Cependant, j'essaie maintenant de l'étendre pour prendre en charge mes autres domaines, en commençant par static.example.com; quand je prends la même approche que ci-dessus, cependant (les deux directives listen, y compris les ipv6only=on argument), j'obtiens l'erreur suivante lors du redémarrage de nginx:

* Starting Nginx Server...
nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3

Il semble que la méthode de liaison de nginx pour IPv6 ne permette peut-être pas les hôtes virtuels basés sur le nom? Dois-je obtenir des adresses IPv6 supplémentaires de mon hôte (ce n'est pas un problème) et utiliser l'hébergement virtuel basé sur IP sur IPv6 avec un hébergement virtuel basé sur IPv4? Ou manque-t-il une solution qui permettra à mes configurations de rester cohérentes sur les deux piles?

J'espérais avoir mon site entièrement sur la pile IPv6 à temps pour World IPv6 Day , mais à moins que je ne puisse le clarifier rapidement, je ne serais peut-être pas prêt. Pas grand-chose d'un point de vue pratique - aucun de mes sites ne peut être qualifié d '"organisation majeure" par aucun effort d'imagination - mais aidez-moi à sauver mon crédit de geek!

Modifié pour ajouter:

Grâce à la réponse de @kolbyjack, j'ai maintenant un serveur Web à double pile entièrement fonctionnel. Par souci de clarté, je modifie la solution qu'il m'a donnée pour que tout le monde puisse voir clairement la réponse.

Mon vhost catchall par défaut a les directives listen suivantes:

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

Je ne sais pas si l'ordonnance est importante, mais elle est là. Ensuite, chaque vhost supplémentaire a les directives listen suivantes:

listen 80;
listen [::]:80;

(Ou 8080 pour celui qui écoute à la place sur ce port.) La partie importante ici semble être l'absence totale d'arguments supplémentaires sur toutes les directives, sauf les directives listen du vhost par défaut - c'est-à-dire aucune répétition de ipv6only=on.

Encore merci à @kolbyjack pour la solution ici!

44
Kromey

Vous n'avez besoin que d'options d'écoute sur une seule déclaration pour un socket. Généralement, vous les mettriez sur la déclaration qui inclut également l'indicateur default_server, mais pour certaines options, je pense que vous pouvez simplement les définir sur n'importe quelle directive d'écoute. Supprimez simplement ipv6only = on de toutes les écoutes sauf une.

46
kolbyjack