web-dev-qa-db-ja.com

500エラーおよび/またはサーバーダウン時にバックアップするHAProxyスイッチ

特定の構成で、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つの理由で機能しません。

  1. Node1(A)が稼働している場合でも、すべての要求はサーバーnode_back(B)にルーティングされます。
  2. サーバーAに対してhttpcheckが実行されていないようです。以上、syslogにサーバーAのダウンに関するエラーは表示されません。

「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
1
user5994461

ちなみに、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
0
drookie