Dies klingt letztendlich nach einem Problem mit Ihrem Backend: nginx stellt eine Anfrage an Ihr Backend, die Verbindung wird sofort abgelehnt, sodass nginx keine andere Option hat, um einen Fehler stromabwärts an den Benutzer weiterzuleiten, da kein anderer Upstream angegeben ist. und die von timeout
Ihnen angegebenen Werte haben hier keine Auswirkung, da nginx überhaupt nicht auf etwas warten muss.
Ich weiß jetzt nicht, was forever
ist oder wie es funktioniert, aber es gibt ein paar mögliche Lösungen, die mir in den Sinn kommen.
Es gibt zwei Möglichkeiten, was auf der Upstream-Seite passiert:
"Forever" akzeptiert möglicherweise die Verbindung und gibt sofort einen Fehler zurück. In diesem Fall sollten Sie sich wirklich fragen, wie Sie die Verbindung nicht falsch handhaben können. Warten Sie jedoch, bis die Bereitstellung Ihrer App abgeschlossen ist, und verarbeiten Sie die Anforderung dann und dort. Die opengrok
App auf dem tomcat
Server hat dieses Problem.
Niemand lauscht auf dem Port, an dem Ihre App ausgeführt werden soll. Daher löscht der Kernel das Paket sofort und gibt sofort ein TCP-RST-Paket zurück.
Wenn TCP RST
die Ursache ist, können Sie es lösen , indem man forever
die Abhörsocket halten, oder von der Kernel - Konfiguration eingehende Pakete für eine bestimmte Zeit in der Warteschlange, im Vorgriff auf jemandem , den sie bis später, so dass bei der Kommissionierung forever
startet wieder nach oben, es‘ Ich habe eine ganze Warteschlange für die Wartung bereit.
Konfigurieren Sie den Kernel so, dass er keine TCP RST
Probleme verursacht, wenn niemand zuhört. Dann timeout
wirkt sich Ihr in nginx aus. Konfigurieren Sie anschließend nginx
eine zweite Anforderung an einen anderen Upstream.
Wenn Sie einen der oben genannten Fälle ansprechen, sind Sie fertig.
Andernfalls müssen Sie versuchen, nginx zu konfigurieren, um das Problem zu beheben:
Sie könnten versuchen , proxy_cache
mit proxy_cache_use_stale
.
Sie könnten versuchen, den Fehlerbehandler zu verwenden: siehe proxy_intercept_errors
(gilt wahrscheinlich nur, wenn der 503, den Sie erhalten, von Ihrem Backend übergeben wird) und error_page
. Sie möchten Zeit im Fehlerbehandler verschwenden, bis Ihre App wieder hochgefahren ist, und dann eine Anfrage an Ihre App senden.
- Sie könnten Zeit verschwenden, indem Sie eine zweite App ausführen, die einfach so
sleep()
lange dauert, bis Ihre App erneut bereitgestellt wird, und dann entweder eine HTTP-Umleitung bereitstellen oder ohne Antwort beenden. Zum Teufel, Sie könnten dies einfach implementieren, indem Sie versuchen, einen Proxy für einen TCP-Port zu erstellen, den Sie block drop
in der Firewall haben, wodurch Ihre Zeitüberschreitungen in Nginx aktiviert werden. Konfigurieren Sie anschließend nginx für eine zweite Anforderung.
Wenn Sie einen der oben genannten Ansätze implementieren, der die timeout
Aktivierung umfasst , muss anschließend eine zusätzliche Anforderung an das Backend gestellt werden. Sie können die upstream
Direktive dafür verwenden, wobei Sie entweder denselben Server mehrmals angeben oder, falls dies nicht akzeptiert wird, einen Port durch Ihre Firewall spiegeln können, oder, noch besser, Sie können tatsächlich mehrere unabhängige App-Server ausführen .
Das bringt uns zurück zu Ihrem App-Server: Wenn das Problem der sauberen erneuten Bereitstellung nicht gelöst werden kann, sollten Sie möglicherweise zwei solcher App-Server ausführen und nginx verwenden, um den Lastenausgleich zwischen ihnen durchzuführen. Oder stellen Sie sie erneut bereit und wechseln Sie dann zu Nginx auf die neue Kopie, sobald sie tatsächlich fertig ist. Wie können Sie sonst sicher sein, dass Ihre Kunden bereit sind, auch nur 30 Sekunden auf die Antwort Ihrer API zu warten?