Nginx-Proxy-Wiederholung, während das Backend neu gestartet wird


16

Nginx gibt 502 zurück, während das Backend neu gestartet wird. Wie kann ich N-mal mit einer Verzögerung von M Sekunden einen Nginx-Proxy-Wiederholungsversuch durchführen? Gibt es ein Plugin oder etwas anderes?

Antworten:


5

Ich fand heraus, dass Nginx ~ 2 Sekunden brauchte, um Versuche zu erschöpfen, wenn Sie Hunderte von Instanzen desselben Backends angegeben hatten:

    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;

(.... ähm, nach Bedarf wiederholen!)

Ja, ein schrecklicher Kludge - aber es fügt ein gewisses Maß an Hartnäckigkeit hinzu ...

Schlimmer noch, Sie könnten Folgendes verwenden:

    server  localhost:8080 max_fails=0;     
    server  localhost:80 backup;        

Unter der Annahme, dass Nginx auf Port 80 ausgeführt wird, würde dies versuchen, die Anforderung kontinuierlich um Nginx herum zu schleifen, bis localhost: 8080 antwortet. Dh wiederholen Sie eine unendliche (?) Anzahl von Malen mit einer Verzögerung von null Sekunden.

Ich werde jetzt zu meiner gepolsterten Zelle zurück ...


Wird der zweite Ansatz nicht zu einer rekursiven Schleife führen und den Server zum Absturz bringen?
Seun Osewa

@SeunOsewa Es hängt weitgehend davon ab, wie lange es dauert, bis das Backend reagiert, aber ja, das wird irgendwann überlaufen.
Oli

2

Wenn Ihre Nginx-Installation Lua-Unterstützung bietet, können Sie den Client für einige Zeit mit der Schlafmethode festhalten. Die Operation ist nicht blockierend und sperrt den Arbeiter nicht. Beachten Sie, dass der Benutzer nicht unbegrenzt gehalten werden kann, da es schließlich zu einigen anderen Netzwerk-bezogenen Socket- / Firewall-Timeouts kommen kann.

server {
    listen 8502;
    location / {
        #25 seconds sleep
        content_by_lua_block {
             ngx.sleep(25); 
             ngx.exit(ngx.HTTP_BAD_GATEWAY);
        }
    }
}

Dann müssen Sie in Ihrer Upstream-Liste den obigen Server als Backup hinzufügen, um einen Client zu halten.

upstream backend {
    server 127.0.0.1:3001 fail_timeout=2s; #The backend
    server 127.0.0.1:8502 backup; #Lua holding server in the event backend is restarting
}

Und dies sollte in Ihrer Proxy-Standortangabe enthalten sein:

proxy_read_timeout         30;  #Value must be higher than sleep in Lua
proxy_next_upstream error timeout http_502 http_504;

So installieren Sie das luaModul für Nginx unter Ubuntu 17.04:sudo apt-get install libnginx-mod-http-lua
Eugene Mala,

1

Das Nächste, was ich weiß, ist dieses Projekt , das ich aber nie benutzt habe. Ich weiß, dass Lack Back-End-Prüfung hat, vielleicht möchten Sie einen Blick darauf werfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.