Configuración de nginx para reintentar un solo servidor ascendente

14

Estoy usando nginx como proxy inverso y me gustaría que espere algunos segundos y vuelva a intentar una solicitud si el servidor ascendente no responde. De esta forma, puedo reiniciar mi servidor ascendente y, en lugar de que los usuarios vean la puerta de enlace 502 defectuosa, sus navegadores se bloquean durante unos segundos (el proceso de reinicio tarda 3 o 4 segundos). He intentado un par de cosas, puse esto en mi bloque de servidor:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

pero no parecía hacer nada. También intenté agregar esto al bloque ascendente:

server 127.0.0.1:3001 fail_timeout=10s;

De nuevo, no es lo que quería.

es posible? ¿Qué me estoy perdiendo?

Juan
fuente

Respuestas:

1

Las directivas que probó están destinadas a cosas diferentes de lo que desea. Lee su documentación.

La upstreamdocumentación de la directiva explica a fondo cómo funciona un bloque ascendente:

Si se produce un error durante la comunicación con un servidor, la solicitud se pasará al siguiente servidor, y así sucesivamente hasta que se prueben todos los servidores en funcionamiento. Si no se puede obtener una respuesta exitosa de ninguno de los servidores, el cliente recibirá el resultado de la comunicación con el último servidor.

Todo lo dicho allí.

Sin embargo, es posible que pueda procesar el código de error devuelto desde el back-end interceptándolo proxy_intercept_errorsy luego enviándolo $request_uria un script especial que lo trate en nombre del cliente original.

La línea de base es: necesita algo de lógica de código / aplicación para volver a intentar en el lado del cliente (o en el lado de la interfaz).

Bernard Rosset
fuente
0

Como se indicó en otra respuesta, no hay una forma integrada de hacer que nginx haga esto. Una posible solución es utilizar una configuración de equilibrio de carga que consista en su servidor actual y un servidor de respaldo que haga lo siguiente para todas las solicitudes:

  • sondear su servidor actual hasta que vuelva a estar en línea
  • luego responda con un 302 u otro redireccionamiento para que el navegador lo intente nuevamente

Este servidor se marcaría con el indicador de "copia de seguridad" para que solo se pruebe cuando todos los demás servidores estén desconectados ( Equilibrio de carga HTTP> Pesos del servidor ).

usuario987356
fuente