Serwer proxy nginx ponów próbę podczas restartowania backendu


16

Nginx zwraca 502 podczas restartowania backendu. Jak sprawić, by serwer proxy Nginx spróbował ponownie N razy z opóźnieniem M sekund? Czy jest wtyczka lub coś innego?

Odpowiedzi:


5

Odkryłem, że Nginx potrzebował ~ 2 sekund na wyczerpanie prób, jeśli podałeś setki instancji tego samego backendu:

    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, powtórz w razie potrzeby!)

Tak, przerażająca kludge - ale to dodaje pewnej wytrwałości ...

Co gorsza, możesz użyć:

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

Zakładając, że Nginx działa na porcie 80, próbowałoby to w sposób ciągły zapętlić żądanie wokół Nginx, dopóki localhost: 8080 nie odpowie. Tzn. Ponów próbę nieskończoną (?) Liczbę razy z zerowym opóźnieniem.

Wrócę teraz do mojej wyściełanej celi ...


Czy drugie podejście nie spowoduje pętli rekurencyjnej i nie spowoduje awarii serwera?
Seun Osewa

@ SeunOsewa To w dużej mierze zależy od tego, ile czasu zajmie odpowiedź backendu, ale tak, w pewnym momencie to się przepełni.
Oli,

2

Jeśli twoja instalacja nginx obsługuje Lua, możesz zatrzymać klienta przez pewien czas dzięki metodzie uśpienia. Operacja nie blokuje i nie blokuje pracownika. Należy pamiętać, że użytkownik nie może być trzymany w nieskończoność, ponieważ niektóre inne limity czasu związane z gniazdem / zaporą sieciową mogą w końcu wystąpić.

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

Następnie na liście nadrzędnej musisz dodać powyższy serwer jako kopię zapasową, aby zatrzymać klienta.

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
}

Powinno to zostać uwzględnione w specyfikacji lokalizacji proxy:

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

Aby zainstalować luamoduł w nginx na Ubuntu 17.04, uruchom:sudo apt-get install libnginx-mod-http-lua
Eugene Mala

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.