Bilanciamento del carico con failover automatico nginx


29

Sto usando nginx e NginxHttpUpstreamModule per il bilanciamento del carico. La mia configurazione è molto semplice:

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

Ma con questa configurazione, quando uno dei 2 server back-end è inattivo, nginx indirizza comunque la richiesta verso di esso e si traduce in timeout per metà del tempo :(

Esiste una soluzione per fare in modo che nginx instrada automaticamente la richiesta a un altro server quando rileva un server inattivo.

Grazie.

Risposte:


33

Penso che sia perché nginx non sta rilevando che l'upstream è inattivo perché si trova sulla stessa macchina.

Le opzioni che stai cercando sono: proxy_next_upstream e proxy_connect_timeout .

Prova questo:

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

Ho riscontrato problemi con un'installazione Apache / PHP incompleta (file di libreria PEAR mancanti) che ha generato errori http 500. proxy_next_upstream ha appena riprovato sull'altro computer - che ha restituito OK.
Alister Bulman,

5
Perché proxy_redirect è disattivato?
Seun Osewa,

2

Ehi, per favore vedi la wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Fondamentalmente se viene rilevato un errore, il back-end verrà contrassegnato come inattivo per x secondi e riproverà. Quindi se continui a vedere le connessioni è probabilmente nginx che continua a controllare se il backend è diventato disponibile.

Dovrebbe, tuttavia, provare la voce successiva nel blocco upstream, quindi non dovresti effettivamente vedere che non sono disponibili backend se solo uno è inattivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.