Pound 位于用于 SSL 卸载的 HAProxy 前面,因此 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
谢谢你。
如果您的应用程序对用户在会话期间切换应用程序服务器很敏感,那么您希望将粘性保持时间设置为至少与会话 cookie 的过期时间一样长。
您的粘性表设置为在 30 分钟后过期条目。因此,虽然您的用户可能会继续发送相同的会话 ID,但如果他们暂停超过 30 分钟,则他们的连接将重新平衡。如果您不喜欢这种行为,4 小时或更长时间的设置可能适合您。正如我在上面以粗体显示的那样,至少您希望将粘性保持时间设置为至少与会话 cookie 的过期时间一样长。
当您使用该
cookie server insert
选项时,您将添加没有过期时间的烹饪。该 cookie 说明要使用哪个服务器。由于没有到期,客户端将永远不会移动到另一台服务器。但你也需要问问自己为什么关心。切换到另一台服务器会对用户体验产生巨大影响吗?如果是这样,也许你应该认为这是你的网络应用程序中的一个缺陷,并在该层解决它。我可能是错的,但这是值得考虑的事情。
我对此不是很满意,但它确实有效;我在客户端请求中插入了一个 cookie,而不是跟踪 ASP .NET 会话 ID: