J'ai vu divers exemples de configuration pour gérer des hôtes virtuels IPv4 et IPv6 à double pile sur nginx. Beaucoup suggèrent ce modèle:
listen 80;
listen [::]:80 ipv6only=on;
Pour autant que je puisse voir, cela permet exactement la même chose que:
listen [::]:80 ipv6only=off;
Pourquoi utiliseriez-vous le premier? La seule raison pour laquelle je peux penser est si vous avez besoin de paramètres supplémentaires spécifiques à chaque protocole, par exemple si vous ne souhaitez définir que deferred
sur IPv4.
C'est probablement est à propos de la seule raison pour laquelle vous utiliseriez l'ancienne construction, de nos jours.
La raison pour laquelle vous voyez ceci est probablement que la valeur par défaut de ipv6only
changé dans nginx 1.3.4. Avant cela, il était par défaut à off
; dans les versions plus récentes, il est par défaut on
.
Cela se produit pour interagir avec l'option de socket IPV6_V6ONLY sous Linux et des options similaires sur d'autres systèmes d'exploitation, dont les valeurs par défaut ne sont pas nécessairement prévisibles. Ainsi, l'ancienne construction était requise avant la 1.3.4 pour garantir que vous écoutiez réellement les connexions sur IPv4 et IPv6.
La modification de la valeur par défaut nginx pour ipv6only
garantit que la valeur par défaut du système d'exploitation pour les sockets à double pile n'est pas pertinente. Maintenant, nginx se lie explicitement à IPv4, IPv6 ou aux deux, ne dépendant jamais du système d'exploitation pour créer un socket à double pile par défaut.
En effet, mes configurations nginx standard pour les versions antérieures à 1.3.4 ont la première configuration, et postérieures à 1.3.4 ont toutes la deuxième configuration.
Cependant, comme la liaison d'un socket à double pile est une chose réservée à Linux, mes configurations actuelles ressemblent maintenant davantage au premier exemple, mais sans ipv6only
set, à savoir:
listen [::]:80;
listen 80;
Si vous hébergez plusieurs domaines vhost avec une seule instance Nginx, vous ne pouvez pas utiliser la directive d'écoute combinée unique
listen [::]:80 ipv6only=off;
pour chacun d'eux. Nginx a une bizarrerie bizarre où vous ne pouvez spécifier que le ipv6only
paramètre une fois pour chaque port, sinon il ne pourra pas démarrer. Cela signifie que vous ne pouvez pas le spécifier pour chaque bloc de serveur de domaine vhost.
Comme Michael l'a mentionné, à partir de Nginx 1.3.4, le ipv6only
le paramètre par défaut est on
.
Par conséquent, si vous souhaitez héberger plusieurs domaines sur IPv4 et IPv6 avec un seul serveur Nginx, vous êtes obligé d'utiliser deux directives d'écoute pour chaque bloc de serveur de domaine:
listen 80;
listen [::]:80;
De plus, comme l'a mentionné Sander, en utilisant ipv6only=off
a l'inconvénient que les adresses IPv4 sont traduites en IPv6. Cela peut entraîner des problèmes si votre application effectue une vérification IP par rapport à des listes noires comme Akismet ou StopForumSpam, car à moins que vous ne créiez une couche de traduction inverse, votre application vérifie la traduction IPv6 de l'adresse IPv4 du spammeur, qui ne correspondra à aucune des adresses IPv4 de la liste noire.
Avec le ipv6only=off
style de configuration les adresses IPv4 peuvent être affichées comme des adresses IPv6 en utilisant (uniquement logiciel) adresses IPv6 mappées IPv4 dans par exemple des fichiers journaux, des variables d'environnement (REMOTE_ADDR) etc.
À ma connaissance (et selon les documents de http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), en utilisant simplement
listen 80;
... est suffisant si vous souhaitez canaliser le trafic IPv4 et IPv6 sur le même port.
Un problème embêtant que j'ai rencontré lors de l'ajout de la prise en charge IPv6 à un site avec le listen [::]:80 ipv6only=off;
extrait, c'était quand je l'ai ajouté à un vhost et que le default_server était déjà configuré pour écouter les deux 80
et [::]:80
.
nginx
a refusé de démarrer, se plaignant que l'adresse était déjà utilisée!
Remplacement de la magie listen [::]:80 ipv6only=off;
avec les deux lignes traditionnelles listen
permet à nginx
de démarrer très bien.
Autant que listen [::]:80 ipv6only=off;
peut être pratique dans la configuration manuelle, il peut provoquer des problèmes désagréables lorsqu'il est utilisé dans des systèmes de configuration automatisés.