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


29

ロードバランシングに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つのバックエンドサーバーのいずれかがダウンした場合、nginxはまだリクエストをルーティングし、半分の時間でタイムアウトになります:(

ダウンしたサーバーを検出したときにリクエストを別のサーバーに自動的にルーティングするようにnginxを作成するソリューションはありますか?

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

回答:


33

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

探しているオプションは proxy_next_upstreamproxy_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;
}

Apache / PHPの不完全なセットアップ(PEARライブラリファイルが見つからない)で問題が発生し、http 500エラーがスローされました。proxy_next_upstreamは他のマシンで再試行しました-OKを返しました。
アリスターブルマン

5
proxy_redirectがオフになっているのはなぜですか?
スンオセワ

2

ちょっと、wikiをご覧ください:http : //wiki.nginx.org/NginxHttpUpstreamModule#server

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

ただし、アップストリームブロックの次のエントリを試す必要があるため、1つだけがダウンしている場合にバックエンドが利用できないことを実際に確認する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.