équilibrage de charge de basculement automatique nginx

29

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?

Merci.

robinmag
la source

Réponses:

33

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;
}
Guillaume Filion
la source
Je rencontrais des problèmes avec une configuration Apache / PHP incomplète (fichiers de bibliothèque PEAR manquants) qui provoquaient des erreurs http 500. proxy_next_upstream vient de réessayer sur l'autre machine - qui a renvoyé OK.
Alister Bulman
5
Pourquoi proxy_redirect est-il désactivé?
Seun Osewa
2

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.

Martin Fjordvald
la source