balanceamento de carga de failover automático nginx

29

Estou usando o nginx e o NginxHttpUpstreamModule para balanceamento de carga. Minha configuração é muito simples:

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

Mas com essa configuração, quando um dos 2 servidores back-end está inativo, o nginx ainda encaminha a solicitação para ele e resulta em tempo limite na metade do tempo :(

Existe alguma solução para fazer com que o nginx roteie automaticamente a solicitação para outro servidor quando detectar um servidor inativo.

Obrigado.

robinmag
fonte

Respostas:

33

Eu acho que é porque o nginx não está detectando que o upstream está inativo porque está na mesma máquina.

As opções que você está procurando são: proxy_next_upstream e proxy_connect_timeout .

Tente o seguinte:

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
fonte
Eu estava tendo problemas com uma instalação incompleta do Apache / PHP (faltando arquivos da biblioteca PEAR) que gerava erros do http 500. proxy_next_upstream apenas tentou novamente na outra máquina - que retornou OK.
Alister Bulman
5
Por que o proxy_redirect está desativado?
Seun Osewa 15/03/12
2

Ei, veja o wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Basicamente, se uma falha for detectada, o back-end será marcado como inativo por x segundos e tentará novamente. Portanto, se você continuar vendo as conexões, provavelmente é o nginx que verifica se o back-end está disponível.

No entanto, tente a próxima entrada no bloco upstream, para que você não veja realmente que nenhum back-end está disponível se apenas um estiver inativo.

Martin Fjordvald
fonte