
Pound は SSL オフロードのために HAProxy の前にあるため、HAProxy はプレーン テキストの HTTP リクエストを受信します。私は、同じアプリケーションをホストする 2 つの Web アプリケーション サーバーの前に HAProxy (v1.4.8) を配置しています。以下は私の HAProxy 構成です。
現在、クライアントは HAProxy にアクセスし、サイトのルートに対する最初の "GET /" リクエストのために任意のサーバーにアクセスできます。たとえば、クライアントが ServerA にアクセスすると、その時点からは常に ServerA または ServerB によってサービスが提供され、セッションは A または B に固定されます。また、逆のことも起こります。クライアントの最初のリクエストが ServerB に届くと、この最初のリクエストの後は常に ServerB または ServerA によってサービスが提供されます。セッションは固定されますが、最初のリクエストの後、将来のすべてのリクエストに対して反対のサーバーに変更されることがあります。
以下は私の HAProxy 設定です。これを間違って書いたのでしょうか?
listen app-servers 127.0.0.1:80
cookie ASP.NET_SessionId prefix
balance url_param ASP.NET_SessionId
balance roundrobin
option persist
option redispatch
# Balance based on ASP .NET sesssion ID
appsession ASP.NET_SessionId len 64 timeout 30m request-learn prefix
# Active WebApp servers
server appserver1 10.0.0.1:80
server appserver2 10.0.0.2:80
ありがとう。
答え1
アプリがセッション中にユーザーがアプリ サーバーを切り替えることに敏感な場合は、スティッキー ホールド時間を少なくともセッション クッキーの有効期限と同じ長さに設定する必要があります。
スティッキー テーブルは、30 分後にエントリが期限切れになるように設定されています。そのため、ユーザーは同じセッション ID を送信し続ける可能性がありますが、30 分以上一時停止すると、接続が再調整されます。この動作が気に入らない場合は、4 時間以上の設定が適切である可能性があります。上で太字で述べたように、少なくともスティッキー保持時間は、セッション クッキーの有効期限と同じ長さに設定する必要があります。
このオプションを使用するとcookie server insert
、有効期限のないクッキーが追加されます。そのクッキーは、使用するサーバーを指定します。有効期限がないため、クライアントが別のサーバーに移動されることはありません。
しかし、なぜ気にするのかを自問する必要もあります。別のサーバーに切り替えると、ユーザー エクスペリエンスに大きな影響がありますか? もしそうなら、これを Web アプリの欠陥と見なし、そのレイヤーで対処する必要があります。間違っているかもしれませんが、検討する価値はあります。
答え2
これについては、あまり満足していませんが、確実に動作します。ASP .NET セッション ID を追跡する代わりに、クライアント要求に Cookie を挿入しました。
listen app-servers 127.0.0.1:80
cookie server insert
balance roundrobin
option persist
option redispatch
server appserver1 10.0.0.1:80 cookie srv1
server appserver2 10.0.0.2:80 cookie srv2