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?

user78416
quelle

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

Dave
quelle
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;
gertas
quelle
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.

Core-Dump
quelle