haproxy を使用した同じ VPS 上の複数のサイトに関する問題

haproxy を使用した同じ VPS 上の複数のサイトに関する問題

設定

VPSは を使用していますdocker。現在、3 つのコンテナがあります。1 つは haproxy 用で、他の 2 つのコンテナには個別のサイトが含まれています (ポート 8080 で nodejs http サーバーを実行しています)。

以下のドメインとサブドメインを所有しています。

  • マイドメイン
  • deus.ex.machina.mydomain.com
  • メールアドレス

mydomain.com2 つのノード サーバーの最初のノード サーバーにアクセスし、fela.mydomain.com他のノード サーバーにアクセスしたいと思います。3 番目のドメインはdeus.ex.machina.mydomain.com、存在しない IP アドレスにアクセスして、サーバーのダウンをシミュレートし、503 ページが表示されることを確認します。

これが私のですhaproxy.cfg:

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option http-server-close
    timeout connect 5000
    timeout client  10000
    timeout server  10000

listen stats
    bind       :1988
    stats uri /

frontend http-in
        bind *:80

        # define hosts
        acl host_deusexmachina  hdr_beg(host) -i deus.ex.machina.mydomain.com
        acl host_fela           hdr_beg(host) -i fela.mydomain.com
        acl host_mydomain       hdr_beg(host) -i mydomain.com

        # figure out which one to use
        use_backend deusexmachina_cluster   if host_deusexmachina
        use_backend fela_cluster            if host_fela
        use_backend mydomain_cluster        if host_mydomain

backend deusexmachina_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server deusexmachina_s1 172.17.0.99:8080 check cookie deusexmachina_s1

backend fela_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server fela_s1 172.17.0.59:8080 check cookie fela_s1

backend mydomain_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server mydomain_s1 172.17.0.50:8080 check cookie mydomain_s1
  • 172.17.0.50:8080 は動作しています (ポート 8080 の nodejs)
  • 172.17.0.59:8080 は動作しています (ポート 8080 の nodejs)
  • 172.17.0.99:8080 は動作していません (Node.js がダウンしているとシミュレートします)

3 つすべてへのリクエストはすべて同じ IP アドレス (同じデバイス) から送信されているため、次のようになりますoption http-server-close

問題

すると、次のような疑問が残ります。どうした?

約 90% の確率で正しくリダイレ​​クトされます。

  • 接続してmydomain.com更新ボタンを 10 回中 9 回押すと、正しいページ (172.17.0.50:8080) が表示されますが、1 回だけ 503 が表示されます (リダイレクトされたかdeus.ex.machina.mydomain.com、サーバーだったかのどちらかでしょうか? これを確認する方法がわかりません)。

  • 更新ボタンを押すとfela.mydomain.com、10 回中 9 回は正しいページ (172.17.0.59:8080) が表示され、1 回だけmydomain.com(503 ページではない) ページ (172.17.0.50:8080) が表示されます。

  • 更新ボタンを押した場合も同様でdeus.ex.machina.mydomain.com、10 回中 9 回は正しいページ (503 エラー) が表示され、1 回だけmydomain.com(503 ページではない) ページ (172.17.0.50:8080) が表示されます。

追加すると、option httpclose間違ったページにリダイレクトされる可能性が 50/50 になり、状況がさらに悪化します。

3 つのドメインすべてを同じ Chrome ブラウザのタブで開いて、それらを切り替えて更新します。

haproxy がリクエストを混同しているのではないかと思います。おそらく、IP リクエストがどのバックエンドに送信されるかをキャッシュしているのでしょう。ご覧のとおり、私はリクエストを正しいサーバーに転送する Cookie を使用しています (クライアント Cookie をチェックしましたが、すべて正常です)。私は何時間もこれに取り組んできましたが、他に何を試せばいいのか本当にわかりません。

関連情報