web-dev-qa-db-ja.com

すべてのバックエンドサーバーがApacheの背後でHAProxyを実行しているときに、503ではなく502を取得する

私は、Apache 2.2の背後にある専用のロードバランサーとしてHAProxyを実行することをテストしており、Apacheのロードバランサーを使用する現在の構成を置き換えています。現在のApacheのみでは、すべてのバックエンド(Origin)サーバーがダウンしている場合にセットアップすると、Apacheは503サービスを利用できませんというメッセージを表示します。 HAProxyを使用すると、502の不正なゲートウェイ応答が返されます。

Apacheで単純なリバースプロキシ書き換えルールを使用しています

RewriteRule ^/(.*) http://127.0.0.1:8000/$1 [last,proxy]

HAProxyには、次のものがあります(デフォルトのtcpモードで実行)

defaults
    log             global
    option          tcp-smart-accept
    timeout connect 7s
    timeout client  60s
    timeout queue   120s
    timeout server  60s

listen my_server 127.0.0.1:8000
    balance leastconn
    server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
    server backend1 127.0.0.1:8001 check observe layer4 maxconn 2

バックエンドサーバーがダウンしているときにロードバランサーに直接接続するテスト:

[root@dev ~]# wget http://127.0.0.1:8000/ test.html
--2012-05-28 11:45:28--  http://127.0.0.1:8000/
Connecting to 127.0.0.1:8000... connected.
HTTP request sent, awaiting response... No data received.

したがって、おそらくこれは、HAProxyが接続を受け入れてから閉じるという事実に起因します。

2
scarba05

私はこれをtcpモードで動作させることができませんでしたが、httpモードに切り替えると503を取得します

defaults
    mode http
1
scarba05

TCPモードでは、haproxyはステータスコードを出力しないため、残りのポイントは明らかにApacheだけです。haproxyが接続を受け入れて閉じ、Apacheが502を返すためだと思います。期待されます。

したがって、観察している動作は正しいです。とにかく、一般的にはHTTPモードで作業する方が良いでしょう。また、非常に詳細なログを提供する「option httplog」を有効にし、haproxyでキープアライブを維持するApacheの機能を利用する「optionhttp-server-close」を有効にすることをお勧めします。これにより、ローカルソースポートの消費が大幅に削減されます。マシン上で。

5
Willy Tarreau