Ich verwende Nginx / 0.7.68 unter CentOS mit der folgenden Konfiguration:
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
Es proxy_pass
handelt sich um einen DNS-Eintrag, dessen IP sich häufig ändert. Nginx speichert die veraltete IP-Adresse im Cache und fordert die falsche IP-Adresse an.
Wie kann ich verhindern, dass Nginx die IP-Adresse zwischenspeichert, wenn sie veraltet ist?
Antworten:
Es ist eine faszinierende Frage und AFAIK, die nicht gut funktionieren wird. Sie können versuchen, das Upstream- Modul zu verwenden und anhand der Anweisungen für das Failover zu überprüfen, ob es als Hack funktioniert.
2018 edit: vieles hat sich geändert. Überprüfen Sie die Antwort von @ohaal , um echte Informationen zu erhalten.
quelle
server
Flagresolve
, das nur in der kommerziellen Version verfügbar ist (siehe nginx.org/en/docs/http/ngx_http_upstream_module.html#server )Die akzeptierte Antwort hat bei mir unter nginx / 1.4.2 nicht funktioniert.
Die Verwendung einer Variablen
proxy_pass
erzwingt eine Neuauflösung der DNS-Namen, da NGINX Variablen anders als statische Konfigurationen behandelt. Aus der NGINX-proxy_pass
Dokumentation :Zum Beispiel:
Hinweis: Ein Resolver (dh der zu verwendende Nameserver) MUSS verfügbar und konfiguriert sein, damit dies funktioniert (und Einträge in einer
/etc/hosts
Datei werden bei einer Suche nicht verwendet).Standardmäßig wird die Cache-Zeit in Version 1.1.9 oder höher von NGINX-Cache-Antworten mit dem TTL-Wert einer Antwort und einem optionalen
valid
Parameter überschrieben:Vor Version 1.1.9 war das Einstellen der Caching-Zeit nicht möglich, und nginx hat die Antworten immer für die Dauer von 5 Minuten zwischengespeichert. .
quelle
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Ich habe es der Klarheit halber zur Antwort hinzugefügt.set
insidelocation
nicht richtig. VorsichtBy 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;
Es gibt wertvolle Informationen in Gansbrest Kommentar und Ohaal Antwort.
Ich halte es jedoch für wichtig, diesen 2016 veröffentlichten offiziellen Nginx-Artikel zu erwähnen, der das Verhalten von Nginx in dieser Angelegenheit und die möglichen Lösungen klar erläutert: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Wir müssen in der Tat "den Domain-Namen in eine Variable setzen" und die Resolver- Direktive verwenden.
Die Verwendung einer Variablen ändert jedoch das Umschreibeverhalten. Möglicherweise müssen Sie die Rewrite-Direktive verwenden. Dies hängt von Ihrem Standort und der Proxy_Pass-Konfiguration ab.
PS: hätte einen Kommentar gepostet aber noch nicht genug Punkte ...
quelle
Ohaals Antwort trifft die meisten von uns dort, aber es gibt einen Fall, in dem der DNS-Resolver nicht unter 127.0.0.1 läuft (z. B. wenn Sie sich in einer speziellen containerisierten Umgebung befinden).
In diesem Fall möchten Sie möglicherweise die Nginx-Konfiguration auf ändern
resolver ${DNS_SERVER};
. Führen Sie dann vor dem Start von nginx Folgendes ausquelle
Ich habe ein Skript gehackt, um einen Ordner conf.d auf DNS-Änderungen zu überprüfen und nginx bei Erkennung neu zu laden. Es ist ein erster Durchgang und kann sicherlich verbessert werden (im nächsten Durchgang werde ich nginx -T verwenden, um Upstreams speziell zu analysieren. Dieselbe Idee könnte für proxy_pass-Direktiven verwendet werden):
quelle