J'utilise nginx / 0.7.68 sous CentOS avec la configuration suivante:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
Le proxy_pass
est à un enregistrement DNS dont l'IP change fréquemment. Nginx met en cache l'adresse IP obsolète, ce qui entraîne une demande à la mauvaise adresse IP.
Comment puis-je empêcher nginx de mettre en cache l'adresse IP lorsqu'elle est obsolète?
Réponses:
C'est une question intrigante et AFAIK qui ne va pas bien fonctionner. Vous pouvez essayer d'utiliser le module en amont et utiliser les directives de basculement pour voir s'il fonctionne comme un piratage.
Édition 2018: beaucoup de choses ont changé. Vérifiez la réponse de @ohaal pour obtenir de vraies informations à ce sujet.
la source
server
drapeau spécial en amontresolve
qui est uniquement disponible dans la version commerciale (voir nginx.org/en/docs/http/ngx_http_upstream_module.html#server )La réponse acceptée n'a pas fonctionné pour moi sous nginx / 1.4.2.
L'utilisation d'une variable pour
proxy_pass
forcer la resolution des noms DNS, car NGINX traite les variables différemment de la configuration statique. De la documentation NGINXproxy_pass
:Par exemple:
Remarque: Un résolveur (c.-à-d. Le serveur de noms à utiliser) DOIT être disponible et configuré pour que cela fonctionne (et les entrées d'un
/etc/hosts
fichier ne seront pas utilisées dans une recherche).Par défaut, la version 1.1.9 ou ultérieure du cache NGINX répond en utilisant la valeur TTL d'une réponse et un
valid
paramètre facultatif permet de remplacer la durée du cache:Avant la version 1.1.9, il était impossible de régler la durée de la mise en cache, et nginx mettait toujours en mémoire cache les réponses pendant 5 minutes. .
la source
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Je l'ai ajouté à la réponse pour plus de clarté.set
intérieurlocation
ne fonctionne pas correctement. AttentionBy default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
resolver 127.0.0.11 [::1]:5353 valid=15s;
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, qui explique clairement le comportement de nginx à ce sujet et les solutions possibles: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Nous devons en effet "définir le nom de domaine dans une variable" et utiliser la directive resolver .
Cependant, l'utilisation d'une variable modifie le comportement de réécriture. Vous devrez peut-être utiliser la directive rewrite, cela dépend de votre emplacement et de la configuration de proxy_pass.
PS: aurait poster un commentaire mais pas assez de points encore ...
la source
La réponse de ohaal attire la plupart d'entre nous, mais il existe un cas où le résolveur DNS ne vit pas à 127.0.0.1 (par exemple, dans un environnement conteneurisé spécial)
Dans ce cas, vous voudrez peut-être changer la configuration de nginx en
resolver ${DNS_SERVER};
. Puis, avant de commencer nginx, lancezla source
J'ai hacké ensemble un script pour regarder un dossier conf.d en amont pour les modifications du DNS et recharger nginx après détection. C'est une première passe, et peut sûrement être améliorée (la prochaine passe, j'utiliserai nginx -T pour analyser en amont spécifiquement. La même idée pourrait être utilisée pour les directives proxy_pass):
la source