Antworten:
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 ...
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;
lua
Modul für Nginx unter Ubuntu 17.04:sudo apt-get install libnginx-mod-http-lua
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.