多数の同一バックエンド サーバーでホストされている Apache-PHP アプリケーションの負荷分散とフェイルオーバーに HAProxy を使用したいと考えています。 HAproxy で障害が発生したノードを検出し、5xx エラーを返さずに単一の HTTP 要求のコンテキスト内でアクティブなノード グループから削除する方法はありますか。
理想的には、サーバーは応答ヘッダー「ステータス: エラー」を返すことができ、HAProxy はこのヘッダーを検出し、その特定のノードをアクティブ セットから削除する必要があります。
アプリから 5xx エラーを返すことができません。
HAProxy ではこのような構成は可能ですか?
答え1
5xx 応答は依然として応答であるため、デフォルトではクライアントに渡されます。
あなたが言及したレベルにすぐに到達できる製品は見たことがありません。存在しない場合は、カスタムのポスト応答ルールを記述できるロード バランサーが必要であり、そのルールにはプール内の不良ノードの状態を変更して、リクエストをプールに戻すアクセス権が必要です。F5 BigIPの、リバーベッドスティングレイ(Zues)スクリプト要素とノード管理を確実に提供します(f5 例えば下へ)。ワニスそしてイカ純粋なロード バランサではありませんが、バックエンド応答後の応答を変更する機能も提供しています。ただし、ノード/プール管理へのアクセスについてはよくわかりません。5xx 応答と同じ方法で要求タイムアウトを処理する必要があることに注意してください。
ノードのステータスを監視するために使用するページは、アプリケーションの状態を徹底的にテストし、頻繁にアクセスされるものである必要があります。
これに最も近いHAProxyはobserve <mode>
これにより、通常のトラフィックで発生するエラーに反応できるようになります。
アプリから 5xx エラーを返すことができません。
いつかはそれが起こるでしょう、それに対処してください。
答え2
私は mindthemonkey のコメントのほとんどに同意します。応答をブロックしてカスタム コンテンツに置き換えることもできます (502 エラーを使用)。ただし、これは少し制限があり (たとえば、リダイレクトを送信してブラウザーにリクエストを再度送信させるのに使用できます)、かなり汚いです。
そもそもなぜこれをやりたいのですか? 「5xx を返すことはできない」と言うのは間違いです。いずれにしても 5xx を返すことになり、クライアントも定義と仕様によりこれに対処しなければならないからです。これは、5xx を返すと誤動作する CDN の背後にいるからでしょうか? そうであれば、出力エラー コードを書き換えるだけでよいかもしれません (ただし、使用するコードには非常に注意してください。コードはすべて非常に特殊なセマンティクスを持っています)。
答え3
Praveen さん、少なくとも PHP 5.4 を使用している場合は、これが PHP アプリに役立つはずです:
PGP 4.3 から 5.3 を使用している場合は、代わりに header() を使用できます (使用方法についてはマニュアル ページを確認してください)。
技術的には、HAProxy を設定して要求どおりに動作させることは可能ですが、アプリケーションが適切に動作するように変更する方が適切でしょう。その時点で、HA Proxy はそれをほぼ自動的に処理するはずです。