Lösung 1:
Die akzeptierte Antwort hat bei mir unter nginx/1.4.2 nicht funktioniert.
Verwendung einer Variablen in proxy_pass
erzwingt eine erneute Auflösung der DNS-Namen, da NGINX Variablen anders behandelt als statische Konfigurationen. Von NGINX proxy_pass
Dokumentation:
Der Parameterwert kann Variablen enthalten. Wird in diesem Fall eine Adresse als Domainname angegeben, wird der Name unter den beschriebenen Servergruppen gesucht und, falls nicht gefunden, mit einem Resolver ermittelt.
Zum Beispiel:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Hinweis:Ein Resolver (d. h. der zu verwendende Nameserver) MUSS verfügbar und konfiguriert sein, damit dies funktioniert (und Einträge in einem /etc/hosts
Datei wird nicht in einer Suche verwendet).
Standardmäßig verwenden Version 1.1.9 oder höhere Versionen von NGINX-Cache-Antworten den TTL-Wert einer Antwort und einen optionalen valid
Parameter ermöglicht das Überschreiben der Cache-Zeit:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Vor Version 1.1.9 war die Optimierung der Caching-Zeit nicht möglich, und nginx cachte Antworten immer für die Dauer von 5 Minuten. .
Lösung 2:
Es gibt wertvolle Informationen im Gansbrest-Kommentar und in der Ohaal-Antwort.
Aber ich denke, es ist wichtig, diesen offiziellen Nginx-Artikel zu erwähnen, der 2016 veröffentlicht wurde. Er erklärt das Verhalten von Nginx in dieser Angelegenheit und die möglichen Lösungen:https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Wir müssen tatsächlich "den Domänennamen in einer Variablen festlegen" und die Resolver-Direktive verwenden.
Die Verwendung einer Variablen ändert jedoch das Rewrite-Verhalten. Möglicherweise müssen Sie die rewrite-Anweisung verwenden, dies hängt von Ihrem Standort und der Konfiguration von proxy_pass ab.
PS:Hätte einen Kommentar posten sollen, aber noch nicht genug Punkte...
Lösung 3:
Es ist eine faszinierende Frage und AFAIK, das wird nicht gut funktionieren. Sie können versuchen, das Upstream-Modul zu verwenden und die Anweisungen für Failover verwenden, um zu sehen, ob es als Hack funktioniert.
2018 edit:Vieles hat sich geändert. Überprüfen Sie die Antwort von @ohaal, um echte Informationen darüber zu erhalten.
Lösung 4:
Die Antwort von ohaal führt die meisten von uns dorthin, aber es gibt einen Fall, in dem der DNS-Resolver nicht unter 127.0.0.1 lebt (z. B. wenn Sie sich in einer speziellen Containerumgebung befinden)
In diesem Fall möchten Sie vielleicht die nginx conf auf resolver ${DNS_SERVER};
ändern . Führen Sie dann, bevor Sie nginx starten,
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
Beachten Sie, dass Sie den gettext
benötigen Paket installiert, da dieses den envsubst
bereitstellt Befehl.