web-dev-qa-db-ja.com

nginx自動フェイルオーバーロードバランシング

ロードバランシングにnginxとNginxHttpUpstreamModuleを使用しています。私の設定は非常に簡単です:

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

しかし、この構成では、2つのバックエンドサーバーの1つがダウンしても、nginxはそれにリクエストをルーティングし、半分の時間でタイムアウトになります:(

Nginxがダウンしたサーバーを検出したときに、リクエストを別のサーバーに自動的にルーティングするための解決策はありますか?.

ありがとうございました。

29
robinmag

それは同じマシン上にあるため、nginxがアップストリームのダウンを検出していないためだと思います。

探しているオプションは proxy_next_upstream および proxy_connect_timeout です。

これを試して:

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

ねえ、wikiを見てください: http://wiki.nginx.org/NginxHttpUpstreamModule#server

基本的に、障害が検出された場合、バックエンドはx秒間ダウンとしてマークされ、再試行されます。したがって、接続が表示され続ける場合、おそらくバックエンドが使用可能になったかどうかをチェックし続けているのはnginxです。

ただし、上流ブロックの次のエントリを試す必要があるため、1つだけがダウンしている場合に使用可能なバックエンドがないことは実際にはわかりません。

2