Haproxy: 私のセッションは「ちょっと」固定的だ

Haproxy: 私のセッションは「ちょっと」固定的だ

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

関連情報