特定の構成で、2台のバックエンドサーバーの前にHAProxyをセットアップしています。すべての要求はサーバーAに送信する必要があります。ただし、サーバーAが5xxエラーコードを返す場合、すべての要求はバックアップサーバーBに送られます。Aが「up」を返すと、すべての要求がAに送られます。
私はこの構成を試しています:
backend example_cluster
balance roundrobin
option httpclose
option forwardfor
option httpchk HEAD /ping.html HTTP/1.0\r\nHost:www.example.com
http-check disable-on-404
default-server error-limit 1 on-error mark-down
redirect scheme https if !{ ssl_fc }
server node1 1.2.3.4:80 check observe layer7
server node_back 5.6.7.8:443 backup ssl verify none
ただし、次の2つの理由で機能しません。
「optionhttpchk」行とそのすぐ下の2行を削除すると、サーバーAの「observelayer7」も削除します。 HAProxyは、すべての要求をノードAにルーティングすることで機能します。ただし、サーバーAが500を返す場合、HAProxyはBに切り替わりません。したがって、問題はオプションhttpchk構成にあると考えられます。
公式ドキュメントから: HAProxyを使用したアクティブパッシブロードバランシング
defaults
mode http
option http-server-close
timeout client 20s
timeout server 20s
timeout connect 4s
frontend ft_app
bind 10.0.0.100:80 name app
default_backend bk_app
backend bk_app
server s1 10.0.0.1:80 check
server s2 10.0.0.2:80 check backup
ちなみに、haproxyのpre-nginx構成を見つけたので、試してみるべきだと思います。
frontend foo
bind 192.168.0.1:9080
option httpchk
default_backend bar-web
backend bar-web
mode http
balance roundrobin
server bar1 192.168.1.2:9080 check observe layer4 weight 50
server bar2 192.168.1.3:9080 check observe layer4 weight 50