it-swarm-eu.dev

équilibrage de charge de basculement automatique nginx

J'utilise nginx et NginxHttpUpstreamModule pour l'équilibrage de charge. Ma config est très simple:

upstream lb {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen  89;
    server_name localhost;

    location / {
            proxy_pass      http://lb;
            proxy_redirect  off;
            proxy_set_header        Host            $Host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Mais avec cette configuration, lorsque l'un des 2 serveurs principaux est en panne, nginx achemine toujours la demande vers lui et il en résulte un délai d'expiration la moitié du temps :(

Existe-t-il une solution pour que nginx achemine automatiquement la demande vers un autre serveur lorsqu'il détecte un serveur en panne?.

Je vous remercie.

29
robinmag

Je pense que c'est parce que nginx ne détecte pas que l'amont est en panne car il est sur la même machine.

Les options que vous recherchez sont: proxy_next_upstream et proxy_connect_timeout .

Essaye ça:

location / {
        proxy_pass              http://lb;
        proxy_redirect          off;
        proxy_next_upstream     error timeout invalid_header http_500;
        proxy_connect_timeout   2;
        proxy_set_header        Host            $Host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}
34
Guillaume Filion

Hé, veuillez consulter le wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Fondamentalement, si un échec est détecté, le backend sera marqué comme arrêté pendant x secondes et il réessaiera. Donc, si vous continuez à voir les connexions, c'est probablement nginx qui continue de vérifier si le backend est devenu disponible.

Cependant, il devrait essayer l'entrée suivante dans le bloc en amont, de sorte que vous ne devriez pas réellement voir qu'aucun backend n'est disponible si un seul est en panne.

2
Martin Fjordvald