web-dev-qa-db-ja.com

さまざまなバックエンドのホストヘッダーを含めるようにHAProxyを構成する

IISで実行される一連のWeb APIの前にバランサーとしてHAProxyを使用することを検討しています。

  • node1.myapp.mycompany.com
  • node2.myapp.mycomapny.com

現在、ホストヘッダーを使用して、IIS上の適切なWebアプリケーションを正しく解決しています。たとえば、同じサーバー/ポートでotherapp.mycompany.comを実行している場合でも、ホストヘッダーIISを使用すると、どちらを提供するかがわかります。

リクエストにホストヘッダーを含めなかったため、HAProxyでの最初の試行で404エラーが残りました。IISは、指定されたIPにバインドされたデフォルトサイトにサービスを提供し、解決しませんでした。ホスト名。

修正により、次のようなものが残りました。

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80

これは単一のバックエンドに最適ですが、どのバックエンドがリクエストを処理しているかに応じて、正しいHostヘッダーを含める方法に頭を悩ませています。

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

IIS(この場合のnode2は別のサーバー上にあり、したがって別のIP上にあるため、node2が正しく解決されないため、上記を使用しても機能しません。実際、同じサーバー/ IPで実行されている場合、リクエストは「機能する」と思われますが、すべてHost1ヘッダーのnode1によって処理されます。

  • リクエストを処理するために使用されるバックエンドのURLに基​​づいてホストを設定することは可能ですか?
  • もしそうなら、これは私のchecksもバックエンドに基づいて正しいHostヘッダーを提供する必要があることを意味します、それはどのように行われますか?

編集:HA-Proxyバージョン1.7.9を使用しています。2017/08/18

もう少し背景を説明しましょう。以前はmyapp.mycompany.comがAPIリクエストを処理するだけでした。それを拡大する必要があります。クライアントは引き続きmyapp.mycompany.comを呼び出しますが、HAProxyをポイントするだけで、node1.myapp.mycompany.comnode2.myapp.mycompany.comのバランスが取られます。現在のサーバー構成では、各サーバーに単一のIPアドレスをバインドしているため、Hostヘッダーを使用して解決します。

3
Matt

以下が機能するかどうかはわかりませんが、現在テストできませんが、おそらくこれはまだ役に立ちます。 (後でもう一度見ていきます):

解決策1:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request set-header Host node1.myapp.mycompany.com if { srv_id 1 }
    http-request set-header Host node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

解決策2:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-send-name-header Host
    server node1.myapp.mycompany.com node1.myapp.mycompany.com:80
    server node1.myapp.mycompany.com node2.myapp.mycompany.com:80
9
gf_

補足したい gf _ 答え。したがって、彼の回答のアイデアは、値がソースホスト名自体であるカスタムHostヘッダーを追加することです。ソリューション1では、基本的に、彼は srv_id 事。

2番目の方法は、ホストの名前をHostヘッダーとして送信することにより、最初の解決策をショートカットします。

しかし、彼の解決策では、ヘッダーが設定されているだけであることに言及していません。ヘッダーがすでにある場合、既存のヘッダーを置き換えることはできないため、ケースを置き換える必要がある場合ホストヘッダー、あなたはこのような何かをすることができます

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request replace-header Host node1.myapp.mycompany.com node1.myapp.mycompany.com if { srv_id 1 }
    http-request replace-header Host node2.myapp.mycompany.com node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80
1
abmap