J'ai vu divers exemples de configuration pour la gestion des hôtes virtuels IPv4 et IPv6 à double pile sur nginx. Beaucoup suggèrent ce modèle:
listen 80;
listen [::]:80 ipv6only=on;
Autant que je sache, cela donne exactement la même chose que:
listen [::]:80 ipv6only=off;
Pourquoi utiliseriez-vous l'ancien? 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.
listen
directives et les options sont appliquées par paire hôte / port.Réponses:
Ce probablement est la seule raison pour laquelle vous utilisez l'ancienne construction, ces jours -ci .
La raison pour laquelle vous voyez ceci est probablement que la valeur par défaut de
ipv6only
modifiée dans nginx 1.3.4. Avant cela, il était par défaut àoff
; dans les versions plus récentes, la valeur par défaut eston
.Ceci interagit avec l'option de socket IPV6_V6ONLY sous Linux et avec 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 version 1.3.4 pour garantir que vous écoutiez bien les connexions IPv4 et IPv6.
La modification de la valeur par défaut de nginx for
ipv6only
garantit que la valeur par défaut du système d’exploitation pour les sockets à double pile n’est pas pertinente. Maintenant, nginx soit explicitement lié à IPv4, IPv6 ou les deux, sans jamais dépendre 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 à la version 1.3.4 ont la première configuration et les versions ultérieures à la version 1.3.4 ont toutes la deuxième configuration.
Cependant, comme relier un socket double pile est une chose uniquement sous Linux, mes configurations actuelles ressemblent davantage au premier exemple, mais sans
ipv6only
ensemble, à savoir:la source
listen localhost:8080;
semble écouter les deux (1.12.2) et utiliserproxy_pass http://localhost:8080
un équilibre de charge entre :: 1 et 127.0.0.1 - Je devais ajouter une ligne pour ipv6 afin d'obtenir une adresse IP réelle dans les journauxset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Si vous hébergez plusieurs domaines vhost avec une seule instance Nginx, vous ne pouvez pas utiliser la directive d'écoute combinée unique.
pour chacun d'eux. Nginx a une bizarrerie bizarre où vous ne pouvez spécifier le
ipv6only
paramètre qu'une seule fois pour chaque port, sinon le démarrage échouera. 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
paramètre par défaut eston
.Par conséquent, si vous souhaitez héberger plusieurs domaines sur IPv4 et IPv6 avec un seul serveur Nginx, vous devez obligatoirement utiliser deux directives d'écoute pour chaque bloc de serveur de domaine:
En outre, comme l'a mentionné Sander, l'utilisation
ipv6only=off
présente l'inconvénient que les adresses IPv4 sont traduites en IPv6. Cela peut poser problème si votre application vérifie l'IP sur des listes noires telles qu'Akismet ou StopForumSpam car, sauf si vous créez une couche de traduction inversée, votre application vérifie la traduction IPv6 de l'adresse IPv4 du polluposteur, qui ne correspond à aucune des adresses IPv4 de la liste noire.la source
deferred
autres directives par protocole. Il serait utile de pouvoir les spécifier séparément de la directive d'écoute pour la raison que vous dites.ipv6only=off
pour le même port deux fois. Votre réponse a résolu le problème!listen 443; listen [::]:443;
. L'listen [::]:80 ipv6only=off;
utilisationAvec le
ipv6only=off
style de configuration, les adresses IPv4 peuvent être affichées en tant qu'adresses IPv6 à l'aide des adresses IPv6 mappées IPv4 (uniquement logicielles), par exemple dans des fichiers journaux, des variables d'environnement (REMOTE_ADDR), etc.la source
À ma connaissance (et selon la documentation à l’ adresse http://nginx.org/en/docs/http/ngx_http_core_module.html#listen ), en utilisant simplement
... est suffisant si vous souhaitez canaliser le trafic IPv4 et IPv6 sur le même port.
la source