GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man nginx zwingen, DNS (eines dynamischen Hostnamens) jedes Mal aufzulösen, wenn proxy_pass ausgeführt wird?

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,

aus
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.


Linux
  1. So stellen Sie einen dynamischen DNS-Server mit Docker unter Debian 10 bereit

  2. So aktivieren Sie HTTP2 in NGINX

  3. Fehlerbehebung:Hostname kann nicht aufgelöst werden

  4. So ändern Sie den Hostnamen in Debian

  5. Wie deaktiviere ich Passwortabfragen beim Git-Push/Pull?

So aktivieren Sie TLS 1.3 in Nginx

So finden Sie den Hostnamen unter Linux

Wie aktiviere ich IPv6 in Nginx?

Wie installiere ich Nginx unter CentOS 7?

So installieren Sie NGINX unter Ubuntu 18.04

Wie stelle ich meinen DNS ein, wenn resolv.conf überschrieben wird?