Einige Nginx-Reverse-Proxy-Konfigurationen funktionieren einmal am Tag nicht mehr

12

Ich habe einen Nginx-Reverse-Proxy, der Anfragen von einem äußeren Amazon-ELB an interne ELBs weiterleitet.

Ich habe 6 Backend-Instanzen, die die Anforderungen bearbeiten. Die Site-fähigen Konfigurationen sehen folgendermaßen aus, es gibt jedoch unterschiedliche Portnummern und Proxy-Pass. Alles andere ist identisch:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}}

Etwa alle 24 Stunden funktioniert eine der Konfigurationen nicht mehr. Alle anderen Proxys funktionieren einwandfrei. Wenn ich nginx neu starte, funktionieren alle Konfigurationen wieder. Es gibt nichts in error.log, nichts Seltsames in Access Log, Syslog oder Dmesg.

Ist das etwas bekannt? Habe ich mit meinen Proxy-Konfigurationen etwas falsch gemacht? Gibt es noch andere Protokolle, in die ich schauen kann?

user202172
quelle

Antworten:

22

Die Antwort auf diese Frage ist, dass ELBs manchmal die IP-Adressen ändern und nginx beim Start die Namensauflösung vornimmt.

Um dies zu beheben, befindet sich in Ihrer VPC immer ein DNS-Server mit 0,2. Wenn die lokale IP-CIDR 10.0.0.0/16 lautet, befindet sich der DNS-Server auf 10.0.0.2.

Fügen Sie dies der Nginx-Konfiguration hinzu.

resolver 10.0.0.2 valid=10s;

Der proxy_pass muss auch als Variable definiert werden, sonst löst nginx ihn nur einmal auf. Basierend auf der obigen Konfiguration ist dies also die richtige Konfiguration:

server {
    listen 3000;
    location / {
            resolver 10.0.0.2 valid=10s;
            set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
            proxy_pass $backend;
            include /etc/nginx/proxy.conf;
    }
}
user202172
quelle
Weiß jemand, welche Version von Nginx Variablen in der Einstellung proxy_pass unterstützt? Ich versuche es mit elastischer Bohnenstange (Nginx Version 1.6.2) und es will die Variable sowieso nicht akzeptieren, in die ich sie eingefügt habe.
Stephen C
Vielen Dank dafür, macht uns seit ungefähr einem Monat buchstäblich verrückt!
Jim.R
Dieser Artikel über Nginx-Blockwiederholungen gibt auch diese Konfiguration wieder. nginx.com/blog/dns-service-discovery-nginx-plus
Morgan Christiansson
1

Wenn Ihr proxy_pass nicht direkt an eine URL übergeben wurde, wie in Ihrem Beispiel gezeigt ( http://amazonaws.com ), sondern an eine Proxy-Upstream-Farm wie folgt :

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

Dann sind Sie weniger besorgt darüber, dass einer der Upstreams vorübergehend ausfällt. Weil sie alle den gleichen Job machen werden. Wenn einer nicht antwortet, wird der nächste für diese Antwort vertreten. Seelenfrieden.

Nginx überspringt automatisch einen ausgefallenen Computer für x Sekunden. Bis Sie es reparieren oder bis es von selbst zurückkehrt. ( http://wiki.nginx.org/HttpUpstreamModule )

Was auch immer der Grund für Ihre Unterbrechungen sein mag, durch die Verteilung auf einer vorgelagerten Farm wird dies zu einer einfacheren Einrichtung.

user18099
quelle
Danke für deine Antwort! Das Seltsame ist, dass ich eine Anfrage an die Backend-Instanz direkt stellen kann, aber nicht über Nginx. Wenn ich nur nginx neu starte, wird die Anfrage erneut weitergeleitet. Da dies bereits in der Produktionsumgebung ist, möchte ich wirklich herausfinden, warum eine der Konfigurationen "entladen" zu sein scheint oder wie ich herausfinden kann, was Nginx wirklich hinter den Kulissen tut.
user202172
Vielleicht möchten Sie dann nach weiteren Nginx-Protokollierungsinformationen suchen. Dies ist ein Problem, bei dem jemand wie Sie versucht hat, mehr über "intermittierende Probleme [...] Ich bin ein Proxy" zu erfahren. Stackoverflow.com/questions/9914792/… Er beschreibt eine Möglichkeit, relevantere Protokolle abzurufen . Ich hoffe es hilft.
user18099