Solution 1 :
La réponse acceptée n'a pas fonctionné pour moi sur nginx/1.4.2.
Utilisation d'une variable dans proxy_pass
force la re-résolution des noms DNS car NGINX traite les variables différemment de la configuration statique. Depuis le NGINX proxy_pass
documents :
La valeur du paramètre peut contenir des variables. Dans ce cas, si une adresse est spécifiée comme nom de domaine, le nom est recherché parmi les groupes de serveurs décrits et, s'il n'est pas trouvé, est déterminé à l'aide d'un résolveur.
Par exemple :
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Remarque :Un résolveur (c'est-à-dire le serveur de noms à utiliser) DOIT être disponible et configuré pour que cela fonctionne (et les entrées dans un /etc/hosts
le fichier ne sera pas utilisé dans une recherche).
Par défaut, la version 1.1.9 ou les versions ultérieures du cache NGINX répondent en utilisant la valeur TTL d'une réponse et un valid
facultatif. paramètre permet de surcharger le temps de cache :
resolver 127.0.0.1 [::1]:5353 valid=30s;
Avant la version 1.1.9, le réglage du temps de mise en cache n'était pas possible et nginx mettait toujours les réponses en cache pendant une durée de 5 minutes. .
Solution 2 :
Il y a des informations précieuses dans le commentaire de gansbrest et la réponse ohaal.
Mais je pense qu'il est important de mentionner cet article officiel de nginx, publié en 2016, il explique clairement le comportement de nginx à ce sujet et les solutions possibles :https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Il faut en effet "Définir le nom de domaine dans une variable" et utiliser la directive résolveur.
cependant, l'utilisation d'une variable modifie le comportement de réécriture. Vous devrez peut-être utiliser la directive de réécriture, cela dépend de votre emplacement et de la configuration de proxy_pass.
PS :j'aurais posté un commentaire mais pas encore assez de points...
Solution 3 :
C'est une question intrigante et AFAIK cela ne fonctionnera pas bien. Vous pouvez essayer d'utiliser le module en amont et utiliser les directives de basculement pour voir si cela fonctionne comme un hack.
Edit 2018 :beaucoup de choses ont changé. Vérifiez la réponse de @ohaal pour obtenir de vraies informations à ce sujet.
Solution 4 :
La réponse d'ohaal y emmène la plupart d'entre nous, mais il y a un cas où le résolveur DNS ne vit pas à 127.0.0.1 (par exemple lorsque vous êtes dans un environnement conteneurisé spécial)
Dans ce cas, vous voudrez peut-être changer la configuration nginx en resolver ${DNS_SERVER};
. Ensuite, avant de démarrer nginx, exécutez
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
Notez que vous avez besoin du gettext
package installé, car il fournit le envsubst
commande.