Reintento de proxy nginx mientras el backend se reinicia


16

Nginx devuelve 502 mientras el backend se reinicia. ¿Cómo puedo hacer que el proxy nginx vuelva a intentar N veces con M segundos de retraso? ¿Hay un complemento u otra cosa?

Respuestas:


5

Descubrí que Nginx tardó ~ 2 segundos en agotar los intentos si especificabas cientos de instancias del mismo backend:

    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;
    server  localhost:8080 max_fails=0;

(.... er, repita según sea necesario!)

Sí, un error horrendo, pero agrega un grado de tenacidad ...

Incluso peor que eso, podrías usar:

    server  localhost:8080 max_fails=0;     
    server  localhost:80 backup;        

Suponiendo que Nginx se está ejecutando en el puerto 80, esto intentaría recorrer continuamente la solicitud alrededor de Nginx hasta que localhost: 8080 responda. Es decir, vuelva a intentar un número infinito (?) De veces con cero segundos de retraso.

Volveré a mi celda acolchada ahora ...


¿El segundo enfoque no dará como resultado un bucle recursivo y bloqueará el servidor?
Seun Osewa

@SeunOsewa Depende en gran medida del tiempo que demore el backend en responder, pero sí, eso se desbordará en algún momento.
Oli

2

Si su instalación de nginx tiene soporte para Lua, puede mantener el cliente durante algún tiempo con el método de suspensión. La operación no bloquea y no bloquea al trabajador. Tenga en cuenta que el usuario no puede ser retenido infinitamente, ya que finalmente pueden ocurrir algunos otros tiempos de espera de socket / firewall relacionados con la red.

server {
    listen 8502;
    location / {
        #25 seconds sleep
        content_by_lua_block {
             ngx.sleep(25); 
             ngx.exit(ngx.HTTP_BAD_GATEWAY);
        }
    }
}

Luego, en su lista ascendente, debe agregar el servidor anterior como respaldo para mantener un cliente.

upstream backend {
    server 127.0.0.1:3001 fail_timeout=2s; #The backend
    server 127.0.0.1:8502 backup; #Lua holding server in the event backend is restarting
}

Y esto debe incluirse en su especificación de ubicación aproximada:

proxy_read_timeout         30;  #Value must be higher than sleep in Lua
proxy_next_upstream error timeout http_502 http_504;

Para instalar el luamódulo a nginx en ubuntu 17.04 ejecute:sudo apt-get install libnginx-mod-http-lua
Eugene Mala

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.