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