2017-01-04 3 views
0

[KURZVERSION] Ich verstehe, wenn NGINX eine Konfigurationsdatei betrachtet, DNS-Lookups auf den Hostnamen durchführt und die Ergebnisse (IP-Adressen, an denen die Hostnamen aufgelöst werden sollen) irgendwo speichert und bis zum nächsten Mal verwendet in einer Config-Datei (was nach meinem Verständnis ist nicht bis zum nächsten Neustart standardmäßig). Gibt es eine Möglichkeit, dieses Hostname-zu-ips-Mapping zu sehen, das mein aktuell ausgeführter NGINX-Dienst hat? Ich bin mir bewusst, dass es Möglichkeiten gibt, meinen NGINX so zu konfigurieren, dass er Änderungen an IPs für einen Hostnamen berücksichtigt. Ich möchte sehen was mein NGINX derzeit denkt, es sollte meinen Hostnamen auflösen.NGINX - Zeige zwischengespeicherte IPs für Hostnamen in Konfigurationsdateien?

[Ausarbeiten] Ich verwende den DNS-Namen eines AWS ELB (classic) als Hostname für einen Proxy-Pass. Und da sowohl die öffentlichen als auch die privaten IP-Adressen eines AWS-ELBs (ohne vorherige Ankündigung) geändert werden können, wird jede IP-Adresse, die NGINX zu Beginn des Dienstes für diesen Hostnamen zugeordnet hat, bei einer solchen Änderung veraltet. Ich glaube, dass die IP-Änderung gerade für mich passiert ist, da mein NGINX-Dienst Traffic an einen anderen Cluster weiterleitet, als in seiner Konfiguration angegeben ist. Der Neustart des NGINX-Dienstes behebt das Problem. Aber ich schaue noch mal, wo NGINX derzeit denkt, dass es den Traffic senden soll, nicht wie man es repariert oder verhindert (viele Online-Ressourcen für die Arbeit mit dynamischen Upstreams, die ich vor der Bereitstellung meines NGINX-Dienste ...).

Vielen Dank im Voraus!

Antwort

0

Alles, was Sie brauchen, ist die resolver Option.

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

Mit dieser Option nginx werden DNS-Änderungen Nachschlag ohne Neustart. Aber nur für proxy_pass Richtlinie. Dies funktioniert nicht, wenn Sie upstream verwenden. DNS-Auflösung von Upstream-Servern, die nur in der Nginx PLUS-Version unterstützt werden.

Wenn Sie IP von Upstream-Server wissen, gibt es einige Möglichkeiten:
- in PLUS-Version Statusmodul oder upstream_conf Modul, aber PLUS Version
nicht kostenlos nutzen können - einige 3rd-Party-Status Module
- Schreiben Sie diese IP, um mit jeder Anfrage zu protokollieren, fügen Sie einfach $upstream_addr Variable zu Ihrem benutzerdefinierten Zugriffsprotokoll hinzu. $upstream_addr enthält die IP-Adresse des Back-End-Servers, der in der aktuellen Anfrage verwendet wird. Beispiel für config:

log_format upstreamlog '$remote_addr - $remote_user [$time_local] ' 
         '"$request" $status $bytes_sent $upstream_addr'; 

server { 
    ... 
    access_log /tmp/test_access_log upstreamlog; 
    resolver ip.of.local.resolver; 
    location/{ 
    set $pass dns_name.of.backend; 
    proxy_pass http://$pass; 
    } 
} 

Hinweis: immer verwenden Variable für proxy_pass - nur in diesem Fall resolver verwendet. Beispiel für log:

127.0.0.1 - - [10/Jan/2017:02:12:15 +0300] "GET/HTTP/1.1" 200 503 213.180.193.3:80 
127.0.0.1 - - [10/Jan/2017:02:12:25 +0300] "GET/HTTP/1.1" 200 503 213.180.193.3:80 
.... IP address changed, nginx wasn't restarted ... 
127.0.0.1 - - [10/Jan/2017:02:13:55 +0300] "GET/HTTP/1.1" 200 503 93.158.134.3:80 
127.0.0.1 - - [10/Jan/2017:02:13:59 +0300] "GET/HTTP/1.1" 200 503 93.158.134.3:80 
+0

Vielen Dank für den Vorschlag. Und ja, genau das habe ich getan. Was ich jedoch wissen möchte, ist, wie man meinen laufenden NGINX-Dienst in Bezug auf Hostnamen-zu-ips sieht, nicht so sehr, wie man für dynamisches Upstream konfiguriert. – jang0

+0

Bearbeitet. Der schnellste und einfachste Weg, IMHO, $ upstream_addr' in das benutzerdefinierte Zugriffsprotokoll zu schreiben –

+0

Nochmals vielen Dank für die Ausarbeitung! Aber ich denke, das Drucken der Upstream-Adresse in einem benutzerdefinierten Zugriffsprotokoll erfordert einen Neustart des NGINX-Dienstes ... richtig? – jang0

Verwandte Themen