GNU/Linux >> Tutoriels Linux >  >> Linux

Comment forcer nginx à résoudre le DNS (d'un nom d'hôte dynamique) à chaque fois lors de l'exécution de proxy_pass ?

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.


Linux
  1. nginx - 413 Entité de requête trop grande

  2. Comment déployer un serveur DNS dynamique avec Docker sur Debian 10

  3. Dépannage :Impossible de résoudre le nom d'hôte

  4. Dépannage DNS. Le domaine du campus ne se résout pas lors de l'utilisation du réseau du campus ?

  5. Comment désactiver les invites de mot de passe lors de l'exécution de git push/pull ?

Comment activer TLS 1.3 dans Nginx

Comment trouver le nom d'hôte sous Linux

Comment activer IPv6 dans Nginx ?

Comment installer Nginx sur CentOS 7 ?

Comment installer NGINX sur Ubuntu 18.04

Comment configurer mon DNS lorsque resolv.conf est écrasé ?