
Estoy ejecutando NGINX 1.25.3 con el siguiente archivo de configuración que funciona bien siempre que los servidores FCGI ascendentes acepten conexiones y respondan correctamente:
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/;
}
}
Sin embargo, si es necesario reiniciar mis oyentes FCGI ascendentes, tardarán unos 15 segundos en comenzar a aceptar conexiones nuevamente. Durante esta ventana, NGINX devolverá instantáneamente el error HTTP 502 al cliente, que es el comportamiento que espero cambiar.
Lo que me gustaría que sucediera es que NGINX siga intentando conectarse a los servidores FCGI ascendentes durante hasta 20 segundos antes de devolver el error 502.
He probado numerosas variaciones como:
proxy_next_upstream error;
proxy_connect_timeout 2s;
y
proxy_next_upstream error;
proxy_connect_timeout 2s;
proxy_next_upstream_timeout 30s;
y
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;
}
Pero en todos los casos, el cliente recibe una respuesta 502 instantánea cuando los servidores FCGI ascendentes rechazan las conexiones.
¿Hay alguna manera de configurar NGINX para que se comporte de tal manera que reintente conexiones ascendentes repetidamente durante hasta X segundos, devolviendo el error 502 solo si no puede conectarse dentro de ese período de tiempo?
Respuesta1
Para configurar NGINX para que reintente las conexiones ascendentes durante un período específico antes de devolver un error 502, puede usar las directivas proxy_next_upstream y proxy_connect_timeout. A continuación se muestra una configuración actualizada que debería lograr el comportamiento deseado:
por favor usa este código
backend_nomad_internal2 ascendente {servidor 127.0.0.1:42250; servidor 127.0.0.1:42251; servidor 127.0.0.1:42252; }
servidor { escuchar 443 ssl; http2 activado; nombre_servidor internal2.ejemplo.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/;
}
}
En esta configuración:
-> proxy_connect_timeout 2s;: establece el tiempo de espera para establecer una conexión con el servidor ascendente en 2 segundos.
-> proxy_next_upstream error timeout http_500 http_502 http_503 http_504;: Especifica las condiciones bajo las cuales NGINX debe probar el siguiente servidor ascendente. En este caso, incluye errores y tiempos de espera.
-> proxy_timeout 20s;: establece el tiempo máximo permitido entre el establecimiento de una conexión y la recepción de la respuesta del servidor ascendente. En este caso, se establece en 20 segundos.
Con esta configuración, NGINX intentará conectarse a los servidores ascendentes durante hasta 20 segundos, reintentando si es necesario, antes de devolver un error 502 al cliente. Ajuste los tiempos de espera según sus requisitos específicos.