Riprova proxy nginx durante il riavvio del back-end


16

Nginx restituisce 502 mentre il backend si riavvia. Come posso fare in modo che il proxy nginx ritenti N volte con un ritardo di M secondi? C'è un plugin o qualcos'altro?

Risposte:


5

Ho scoperto che Nginx impiegava ~ 2 secondi per esaurire i tentativi se hai specificato centinaia di istanze dello stesso 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;

(.... ehm, ripeti quanto basta!)

Sì, un orribile kludge - ma aggiunge un certo grado di tenacia ...

Ancora peggio, potresti usare:

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

Supponendo che Nginx sia in esecuzione sulla porta 80, questo proverebbe a eseguire il ciclo continuo della richiesta attorno a Nginx fino a quando localhost: 8080 risponde. Vale a dire riprovare un numero infinito (?) Di volte con zero secondi di ritardo.

Tornerò nella mia cella imbottita ora ....


Il secondo approccio non provoca un ciclo ricorsivo e arresta in modo anomalo il server?
Seun Osewa,

@SeunOsewa Dipende in gran parte da quanto tempo impiega il back-end a rispondere, ma sì, a un certo punto traboccerà.
Oli,

2

Se la tua installazione di nginx ha il supporto Lua, puoi rimanere sul client per un po 'di tempo con il metodo sleep. L'operazione non è bloccante e non blocca il lavoratore. Tenere presente che l'utente non può essere trattenuto all'infinito in quanto potrebbero verificarsi infine altri timeout relativi al socket / firewall relativi alla rete.

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

Quindi nel tuo elenco upstream devi aggiungere il server sopra come backup per contenere un client.

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
}

E questo dovrebbe essere incluso nella specifica della posizione proxy:

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

Per installare il luamodulo su nginx su Ubuntu 17.04 eseguire:sudo apt-get install libnginx-mod-http-lua
Eugene Mala,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.