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.
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;
}
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.