Konfigurieren von nginx für den erneuten Versuch eines einzelnen Upstream-Servers

14

Ich verwende nginx als Reverse-Proxy und möchte, dass es einige Sekunden wartet und eine Anfrage erneut versucht, wenn der Upstream-Server nicht antwortet. Auf diese Weise kann ich meinen Upstream-Server neu starten und anstatt dass Benutzer 502 fehlerhafte Gateways sehen, hängen ihre Browser nur einige Sekunden lang (der Neustartvorgang dauert 3 oder 4 Sekunden). Ich habe ein paar Dinge ausprobiert, ich habe dies in meinen Serverblock eingefügt:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

aber es schien nichts zu tun. Ich habe auch versucht, dies dem Upstream-Block hinzuzufügen:

server 127.0.0.1:3001 fail_timeout=10s;

wieder nicht was ich wollte.

Ist das möglich? Was vermisse ich?

John
quelle

Antworten:

1

Die Anweisungen, die Sie ausprobiert haben, sind für andere Zwecke gedacht als gewünscht. Lesen Sie die Dokumentation.

In der upstreamDirektivendokumentation wird ausführlich erläutert, wie ein Upstream-Block funktioniert:

Wenn während der Kommunikation mit einem Server ein Fehler auftritt, wird die Anforderung an den nächsten Server usw. weitergeleitet, bis alle funktionierenden Server ausprobiert sind. Wenn von keinem der Server eine erfolgreiche Antwort erhalten werden konnte, erhält der Client das Ergebnis der Kommunikation mit dem letzten Server.

Alles sagte dort.

Möglicherweise können Sie den zurückgegebenen Fehlercode jedoch vom Backend verarbeiten, indem Sie ihn abfangen proxy_intercept_errorsund dann $request_uriim Namen des ursprünglichen Clients an ein spezielles Skript senden, das sich damit befasst.

Die Grundlinie lautet: Sie benötigen eine Code- / Anwendungslogik, um die Clientseite (oder die Frontend-Seite) erneut zu versuchen.

Bernard Rosset
quelle
0

Wie in einer anderen Antwort angegeben, gibt es keine integrierte Möglichkeit, Nginx dazu zu bringen, dies zu tun. Eine mögliche Lösung besteht darin, ein Lastausgleichs-Setup zu verwenden, das aus Ihrem aktuellen Server und einem Sicherungsserver besteht, der für alle Anforderungen Folgendes ausführt:

  • Fragen Sie Ihren aktuellen Server ab, bis er wieder online ist
  • Antworten Sie dann mit einer 302 oder einer anderen Weiterleitung, damit der Browser es erneut versucht

Dieser Server wird mit dem Flag "Backup" gekennzeichnet, sodass er nur versucht wird, wenn alle anderen Server offline sind ( HTTP-Lastausgleich> Servergewichte ).

user987356
quelle