Nginx Automatic Failover Load Balancing

29

Ich verwende Nginx und NginxHttpUpstreamModule für den Lastenausgleich. Meine Konfiguration ist sehr einfach:

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

Wenn einer der beiden Backend-Server in dieser Konfiguration nicht verfügbar ist, leitet nginx die Anforderung weiterhin an diesen weiter und es tritt in der Hälfte der Zeit eine Zeitüberschreitung auf :(

Gibt es eine Lösung, mit der nginx die Anforderung automatisch an einen anderen Server weiterleitet, wenn ein ausgefallener Server erkannt wird?

Vielen Dank.

Rotkehlchen
quelle

Antworten:

33

Ich denke, das liegt daran, dass Nginx nicht erkennt, dass der Upstream nicht funktioniert, weil er sich auf demselben Computer befindet.

Folgende Optionen werden gesucht: proxy_next_upstream und proxy_connect_timeout .

Versuche dies:

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
quelle
Ich hatte Probleme mit einem unvollständigen Apache / PHP-Setup (fehlende PEAR-Bibliotheksdateien), das http 500-Fehler verursachte. proxy_next_upstream hat es gerade auf dem anderen Computer versucht - das hat OK zurückgegeben.
Alister Bulman
5
Warum ist proxy_redirect ausgeschaltet?
Seun Osewa
2

Hey, bitte schau im Wiki nach: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Wenn ein Fehler festgestellt wird, wird das Backend für x Sekunden als inaktiv markiert und es wird erneut versucht. Wenn Sie also weiterhin Verbindungen sehen, prüft wahrscheinlich Nginx, ob das Backend verfügbar ist.

Es sollte jedoch der nächste Eintrag im Upstream-Block ausprobiert werden, sodass Sie nicht sehen sollten, dass keine Backends verfügbar sind, wenn nur eines ausgefallen ist.

Martin Fjordvald
quelle