Haproxy: Meine Sitzungen sind „irgendwie“ klebrig

Haproxy: Meine Sitzungen sind „irgendwie“ klebrig

Pound ist vor HAProxy für SSL-Offload, sodass HAProxy HTTP-Anfragen im Klartext empfängt. Ich habe HAProxy (v1.4.8) vor zwei Web-App-Servern, die dieselbe Anwendung hosten. Unten ist meine HAProxy-Konfiguration.

Derzeit greift ein Client auf HAProxy zu und kann für seine erste „GET /“-Anforderung an die Stammadresse der Site zu jedem beliebigen Server gehen. Wenn ein Client beispielsweise auf ServerA zugreift, kann er von diesem Punkt an immer von ServerA oder ServerB bedient werden, je nachdem, welcher Server dies ist, bleibt die Sitzung bei A oder B. Auch das Gegenteil ist möglich: Die erste Anforderung eines Clients kann an ServerB gehen, nach dieser ersten Anforderung wird er immer von ServerB oder ServerA bedient. Die Sitzung bleibt bestehen, aber manchmal gibt es nach der ersten Anforderung diesen Wechsel zum gegnerischen Server für alle zukünftigen Anforderungen.

Unten ist meine HAProxy-Konfiguration. Habe ich das falsch aufgeschrieben?

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

Danke schön.

Antwort1

Wenn Ihre App also empfindlich darauf reagiert, dass Benutzer während einer Sitzung den App-Server wechseln, sollte die Sticky-Hold-Zeit mindestens so lang sein wie die Ablaufzeit des Sitzungscookies.

Ihre Sticky-Tabelle ist so eingestellt, dass Einträge nach 30 Minuten ablaufen. Ihre Benutzer senden also möglicherweise weiterhin dieselbe Sitzungs-ID, aber wenn sie länger als 30 Minuten pausieren, wird ihre Verbindung neu ausbalanciert. Wenn Ihnen dieses Verhalten nicht gefällt, ist für Sie wahrscheinlich eine Einstellung von 4 Stunden oder mehr angemessen. Wie ich oben in Fettschrift sagte, sollte die Sticky-Hold-Zeit mindestens so lang sein wie die Ablaufzeit des Sitzungscookies.

Wenn Sie diese Option verwenden cookie server insert, fügen Sie ein Cookie ohne Ablaufzeit hinzu. Und dieses Cookie gibt an, welcher Server verwendet werden soll. Da es kein Ablaufdatum gibt, wird der Client nie auf einen anderen Server verschoben.

aber Sie müssen sich auch fragen, warum Ihnen das wichtig ist. Hat der Wechsel zu einem anderen Server große Auswirkungen auf die Benutzererfahrung? Wenn ja, sollten Sie dies vielleicht als einen Fehler in Ihrer Web-App betrachten und ihn auf dieser Ebene beheben. Ich könnte mich irren, aber es ist etwas, worüber Sie nachdenken sollten.

Antwort2

Ich bin damit nicht besonders zufrieden, aber es funktioniert zuverlässig. Ich habe ein Cookie in die Client-Anfragen eingefügt, anstatt die ASP .NET-Sitzungs-ID zu verfolgen:

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

verwandte Informationen