
Ich verwende NGINX 1.25.3 mit der folgenden Konfigurationsdatei, die gut funktioniert, sofern die Upstream-FCGI-Server Verbindungen akzeptieren und ordnungsgemäß reagieren:
upstream backend_nomad_internal2 {
# Multiple FCGI listeners defined below
server 127.0.0.1:42250;
server 127.0.0.1:42251;
server 127.0.0.1:42252;
}
server {
listen 443 ssl;
http2 on;
server_name internal2.example.com;
# BUNCH OF ssl_* CONFIG HERE
location ~ \.fcgi$ {
root /usr/share/nginx/html_live/;
fastcgi_keep_conn on;
fastcgi_pass backend_nomad_internal2;
fastcgi_index index.html;
fastcgi_split_path_info ^(.*cgi)(/.*)$;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html_live/;
}
}
Wenn meine Upstream-FCGI-Listener jedoch neu gestartet werden müssen, dauert es etwa 15 Sekunden, bis sie wieder Verbindungen annehmen. Während dieses Zeitfensters gibt NGINX sofort den HTTP-Fehler 502 an den Client zurück. Dies ist das Verhalten, das ich zu ändern hoffe.
Stattdessen möchte ich, dass NGINX bis zu 20 Sekunden lang versucht, eine Verbindung zu den vorgelagerten FCGI-Servern herzustellen, bevor der Fehler 502 zurückgegeben wird.
Ich habe zahlreiche Variationen ausprobiert, wie zum Beispiel:
proxy_next_upstream error;
proxy_connect_timeout 2s;
Und
proxy_next_upstream error;
proxy_connect_timeout 2s;
proxy_next_upstream_timeout 30s;
Und
error_page 502 503 504 = @retry;
}
location @retry {
proxy_pass http://backend_nomad_internal2;
proxy_next_upstream_timeout 30s;
proxy_next_upstream error;
proxy_next_upstream_tries 3; # Adjust the number of retries as needed
proxy_connect_timeout 2s;
}
Aber in allen Fällen erhält der Client eine sofortige 502-Antwort, wenn die Upstream-FCGI-Server Verbindungen ablehnen.
Gibt es eine Möglichkeit, NGINX so zu konfigurieren, dass es Upstream-Verbindungen bis zu X Sekunden lang wiederholt versucht und nur dann den Fehler 502 zurückgibt, wenn innerhalb dieses Zeitraums keine Verbindung hergestellt werden kann?
Antwort1
Um NGINX so zu konfigurieren, dass Upstream-Verbindungen für eine bestimmte Dauer wiederholt werden, bevor ein 502-Fehler zurückgegeben wird, können Sie die Anweisungen proxy_next_upstream und proxy_connect_timeout verwenden. Unten finden Sie eine aktualisierte Konfiguration, die das gewünschte Verhalten erzielen sollte:
Bitte verwenden Sie diesen Code
upstream backend_nomad_internal2 { Server 127.0.0.1:42250; Server 127.0.0.1:42251; Server 127.0.0.1:42252; }
Server { listen 443 ssl; http2 ein; Servername internal2.example.com;
# BUNCH OF ssl_* CONFIG HERE
location ~ \.fcgi$ {
root /usr/share/nginx/html_live/;
fastcgi_keep_conn on;
# Use the following directives to control upstream connection behavior
proxy_connect_timeout 2s;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_timeout 20s;
fastcgi_pass backend_nomad_internal2;
fastcgi_index index.html;
fastcgi_split_path_info ^(.*cgi)(/.*)$;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_page 500 502 503 504 = @retry;
location @retry {
# Retry the connection for up to 20 seconds
proxy_pass http://backend_nomad_internal2;
proxy_connect_timeout 2s;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_timeout 20s;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html_live/;
}
}
In dieser Konfiguration:
-> proxy_connect_timeout 2s;: Setzt das Timeout für den Verbindungsaufbau mit dem Upstream-Server auf 2 Sekunden.
-> proxy_next_upstream Fehler-Timeout http_500 http_502 http_503 http_504;: Gibt die Bedingungen an, unter denen NGINX den nächsten Upstream-Server ausprobieren soll. In diesem Fall schließt es Fehler und Timeouts ein.
-> proxy_timeout 20s;: Legt die maximal zulässige Zeit zwischen dem Aufbau einer Verbindung und dem Empfang der Antwort vom Upstream-Server fest. In diesem Fall ist der Wert auf 20 Sekunden eingestellt.
Mit diesen Einstellungen versucht NGINX bis zu 20 Sekunden lang, eine Verbindung zu den Upstream-Servern herzustellen. Bei Bedarf wiederholt es den Versuch, bevor ein 502-Fehler an den Client zurückgegeben wird. Passen Sie die Timeouts entsprechend Ihren spezifischen Anforderungen an.