nginx automatyczne równoważenie obciążenia awaryjnego

29

Używam nginx i NginxHttpUpstreamModule do równoważenia obciążenia. Moja konfiguracja jest bardzo prosta:

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

Ale przy tej konfiguracji, gdy jeden z 2 serwerów zaplecza jest wyłączony, nginx nadal kieruje do niego żądania i powoduje to przekroczenie limitu czasu przez połowę czasu :(

Czy istnieje jakieś rozwiązanie, dzięki któremu nginx automatycznie przekieruje żądanie do innego serwera, gdy wykryje on wyłączony serwer.

Dziękuję Ci.

robinmag
źródło

Odpowiedzi:

33

Myślę, że to dlatego, że nginx nie wykrywa, że ​​upstream jest wyłączony, ponieważ jest na tej samej maszynie.

Dostępne opcje to: proxy_next_upstream i proxy_connect_timeout .

Spróbuj tego:

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
źródło
Miałem problemy z niepełną konfiguracją Apache / PHP (brakujące pliki biblioteki PEAR), która generowała błędy http 500. proxy_next_upstream właśnie ponowił próbę na innym komputerze - to zwróciło OK.
Alister Bulman
5
Dlaczego proxy_redirect jest wyłączone?
Seun Osewa,
2

Hej, zobacz wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Zasadniczo, jeśli zostanie wykryta awaria, backend zostanie oznaczony jako x na x sekund i spróbuje ponownie. Więc jeśli nadal widzisz połączenia, prawdopodobnie nginx sprawdza, czy backend stał się dostępny.

Powinien jednak wypróbować następny wpis w górnym bloku, więc nie powinieneś widzieć, że żadne backendy nie są dostępne, jeśli tylko jeden jest wyłączony.

Martin Fjordvald
źródło