私は、背後に複数のバックエンドを持つ haproxy サーバーを持っています。バックエンドはラウンドロビンで選択されます。いずれにしても、選択したバックエンドから 404 を受け取った場合は、他のバックエンドを試す必要があります。
到達可能なすべてのバックエンドから 404 が返された場合、haproxy はクライアントに 404 を返す必要があります。
それは可能ですか?
答え1
いいえ、今のところは不可能です。
HAProxy は、リクエストが送信される前にエラー (接続タイムアウトなど) が発生した場合、別のバックエンド サーバーを再試行します。1 つのバックエンド サーバーとの接続が確立され、リクエストが 1 バイトでも送信された場合、HAProxy は別のバックエンド サーバーの使用を試行しません。
答え2
No.
option redispatch
は HAProxy に最も近いものですが、が 0 より大きく、バックエンドへの接続が失敗した場合にのみ、別のバックエンドを再試行しますretries
。バックエンドからの HTTP ステータス コードは考慮せず、バックエンドがダウンしているかどうか (アクセスできない、応答がない) のみを考慮
答え3
はい、私が正しく理解していれば、オプションで
option httpchk GET /../CheckHealth.html
http-check disable-on-404
CheckHealth.html は到達可能なリソース サンプルであるはずですが、リソースが見つからず 404 エラーを受信した場合、ノードは「メンテナンスのためアクティブまたはバックアップのソフト停止」に設定され、ラウンドロビンは他のノードに切り替えてそのノードに再度要求を送信することはありません。
何かのようなもの :
backend backend_servers
balance roundrobin
option httpchk GET /.../CheckHealth.html
http-check disable-on-404
server www01 XX:YY:ZZ:KK:8180 check
server www02 XX:YY:ZZ:MM:8180 check
server www03 XX:YY:ZZ:FF:8180 check
www02 では WAR がデプロイされていないため失敗し、www01、www03 ではバランスが取れており、クライアントには失敗は表示されません。