Was passiert mit bestehenden HTTP- und Websocket-Verbindungen, wenn die NGINX-Konfiguration neu geladen wird?

Was passiert mit bestehenden HTTP- und Websocket-Verbindungen, wenn die NGINX-Konfiguration neu geladen wird?

Nehmen wir an, wir haben ein ziemlich standardmäßiges Blau/Grün-Bereitstellungs-Setup. NGINX leitet derzeit den gesamten Datenverkehr per Proxy an den Live-Server (BLAU). Dann stellen wir eine aktualisierte Version unseres Codes auf dem inaktiven Server (GRÜN) bereit. Schließlich aktualisieren wir die NGINX-Konfiguration, sodass der gesamte HTTP-Datenverkehr an GRÜN weitergeleitet wird.

Nach meinem Verständnis wird NGINX dieses Neuladen problemlos handhaben. Alle zukünftigen HTTP-Anfragen werden an GRÜN weitergeleitet und alle ausstehenden HTTP-Anfragen, die es an BLAU geschafft haben, werden von BLAU bearbeitet.

Aber was ist mit WebSockets? Nehmen wir an, dass BLUE beim Neuladen der Konfiguration zehn aktive WebSocket-Verbindungen hatte. Was passiert mit ihnen?

Nach meinem Verständnis der NGINX-Dokumentation, die Verbindungen werden nach 60 Sekunden beendet, wenn keine neuen Daten gesendet werden.

Wenn die Clients jedoch eine Art Keep-Alive oder Ping verwenden, würde ich davon ausgehen, dass die WebSocket-Verbindungen auf unbestimmte Zeit aufrechterhalten werden, auch wenn BLUE keinen anderen HTTP-Verkehr mehr bedient.

Ist meine Intuition hier richtig? Wenn ja, würde ich mir vorstellen, dass BLUE entweder selbst die Verbindungen schließen muss oder der clientseitige Code dies tut, es sei denn, NGINX verfügt über eine Funktion, die ich übersehe.

Antwort1

Richtig, die Verbindungen werden auf unbestimmte Zeit aufrechterhalten. Für solche Fälle gibt es eine spezielle Richtlinie:

https://nginx.org/en/docs/ngx_core_module.html#worker_shutdown_timeout

verwandte Informationen