web-dev-qa-db-ja.com

Haproxy:私のセッションは「一種の」粘着性があります

ポンドは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

ありがとうございました。

2
jwbensley

私はこれについてあまり満足していませんが、信頼できる動作です。 ASP .NETセッションID:

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
1
jwbensley

セッション中にユーザーがアプリサーバーを切り替えることにアプリが敏感な場合は、少なくともセッションCookieの有効期限と同じ長さにねんちゃく時間を設定する必要があります。

スティッキーテーブルは、30分後にエントリを期限切れにするように設定されています。そのため、ユーザーは同じセッションIDを送信し続けることができますが、30分を超えて一時停止すると、接続のバランスが再調整されます。この動作が気に入らない場合は、4時間以上の設定がおそらく適切です。上で太字で述べたように、少なくとも、ねんちゃく時間は少なくともセッションCookieの有効期限と同じ長さに設定する必要があります。

cookie server insertオプションを使用すると、有効期限のない料理を追加することになります。そのCookieは、使用するサーバーを示します。有効期限がないため、クライアントが別のサーバーに移動されることはありません。

しかし、なぜ気にするのかを自問する必要もあります。別のサーバーへの切り替えは、ユーザーエクスペリエンスに大きな影響を与えますか?もしそうなら、多分あなたはこれをあなたのウェブアプリの欠陥と考えて、その層でそれに対処するべきです。私は間違っているかもしれませんが、考えるのは何かしらです。

2
longneck