
Pound 位於 HAProxy 的前面,用於 SSL 卸載,因此 HAProxy 接收純文字 HTTP 請求。我在託管同一應用程式的兩個 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
如果您的應用程式對使用者在會話期間切換應用程式伺服器很敏感,那麼您希望將黏性保持時間設定為至少與會話 cookie 的過期時間一樣長。
您的黏性表設定為 30 分鐘後條目過期。因此,雖然您的用戶可能會繼續發送相同的會話 ID,但如果他們暫停超過 30 分鐘,那麼他們的連線將重新平衡。如果您不喜歡這種行為,4 小時或更長的設定可能適合您。正如我上面粗體所說,您至少希望將黏性保持時間設定為至少與會話 cookie 的過期時間一樣長。
當您使用該cookie server insert
選項時,您將添加沒有過期時間的烹飪。該 cookie 說明要使用哪個伺服器。由於沒有過期時間,客戶端永遠不會被移到另一台伺服器。
但你也需要問自己為什麼要關心。切換到其他伺服器對使用者體驗影響大嗎?如果是這樣,也許您應該認為這是您的網頁應用程式中的缺陷,並在該層解決它。我可能是錯的,但這是值得考慮的事情。
答案2
我對此不是很高興,但它確實有效;我已將 cookie 插入客戶端請求中,而不是追蹤 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