nouvelle tentative de proxy nginx pendant que le backend redémarre


16

Nginx renvoie 502 pendant que le backend redémarre. Comment puis-je faire réessayer le proxy nginx N fois avec un retard de M secondes? Existe-t-il un plugin ou autre chose?

Réponses:


5

J'ai trouvé que Nginx prenait ~ 2 secondes pour épuiser les tentatives si vous spécifiez des centaines d'instances du même 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;

(.... euh, répétez au besoin!)

Oui, une horrible culpabilité - mais cela ajoute un certain degré de ténacité ...

Pire encore, vous pouvez utiliser:

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

En supposant que Nginx s'exécute sur le port 80, cela tenterait de boucler continuellement la demande autour de Nginx jusqu'à ce que localhost: 8080 réponde. C'est-à-dire réessayer un nombre infini (?) De fois avec un retard de zéro seconde.

Je vais retourner dans ma cellule rembourrée maintenant ....


La deuxième approche ne se traduira-t-elle pas par une boucle récursive et plantera-t-elle le serveur?
Seun Osewa

@SeunOsewa Cela dépend en grande partie du temps qu'il faut au backend pour répondre, mais oui, cela va déborder à un moment donné.
Oli

2

Si votre installation nginx prend en charge Lua, vous pouvez conserver le client pendant un certain temps avec la méthode sleep. L'opération n'est pas bloquante et ne verrouille pas le travailleur. Gardez à l'esprit que l'utilisateur ne peut pas être maintenu indéfiniment car certains autres délais d'attente de socket / pare-feu liés au réseau peuvent se produire finalement.

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

Ensuite, dans votre liste en amont, vous devez ajouter le serveur ci-dessus comme sauvegarde pour contenir 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
}

Et cela devrait être inclus dans votre spécification d'emplacement proxy:

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

Pour installer le luamodule sur nginx sur ubuntu 17.04, exécutez:sudo apt-get install libnginx-mod-http-lua
Eugene Mala

1

La chose la plus proche que je connaisse est ce projet , mais je ne l'ai jamais utilisé. Je sais que le vernis a une vérification de backend, peut-être que vous voulez y jeter un œil.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.