我们的应用程序需要基于cookie的粘性会话,因此我们希望使用HAproxy来平衡传入流量到IIS服务器场。
我们正在使用以下配置,该配置似乎在实验室中工作(循环工作正常并保留会话),但在生产中应用时有超过3k并发用户失败:
前端Front_http
bind :80
mode http
default_backend backend_http
stats enable
capture cookie ASP.NET_SessionId len 32
maxconn 10000
前端Front_https
mode http
default_backend backend_https
bind *:443 ssl crt /etc/haproxy/cert.pem
capture cookie ASP.NET_SessionId len 32
maxconn 10000
backend backend_http
balance roundrobin
option forwardfor
stick-table type ip size 20k expire 5m
appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
server Server_1 192.168.10.81:80 cookie Server_1
server Server_2 192.168.10.81:80 cookie Server_2
server Server_3 192.168.10.81:80 cookie Server_3
backend backend_https
balance roundrobin
option forwardfor
stick-table type ip size 20k expire 5m
appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
server Server_1 192.168.10.81:80 cookie Server_1 ssl verify none
server Server_2 192.168.10.81:80 cookie Server_2 ssl verify none
server Server_3 192.168.10.81:80 cookie Server_3 ssl verify none
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
从HAProxy 1.5.8文档中我了解基于cookie的粘性是通过命令" appsession"来实现的,但我不了解其他命令所扮演的角色,例如"捕捉cookie&# 34;或者"棒表",在使用appsession时它们是否必要?任何人都可以帮助我了解它们的工作原理,并建议您是否发现我们的配置有任何问题。
答案 0 :(得分:24)
首先,你能解释一下“不起作用”或你当前的配置面临哪些问题?
您当前的配置存在一些问题: - appsession stickness无法抵抗重装。这意味着每次重新加载HAProxy后都会失去粘性 - 您的SSL后端可能有拼写错误,因为您正在将SSL流量转发到端口80,这与您用于清除HTTP的端口相同。
HAProxy允许多种方式来执行基于cookie的持久性。
cookie插入:HAProxy将自己设置为cookie:
backend mybk
[...]
cookie SERVERID insert indirect nocache
[...]
server s1 10.0.0.1:80 check cookie s1
server s2 10.0.0.2:80 check cookie s2
cookie前缀:HAProxy使用现有的cookie(通常是应用程序)并在服务器名称前加上其值:
backend mybk
[...]
cookie ASP.NET_SessionId prefix nocache
[...]
server s1 10.0.0.1:80 check cookie s1
server s2 10.0.0.2:80 check cookie s2
粘贴表:HAProxy学习并使用应用程序cookie,无需修改:
backend mybk
[...]
stick-table type string len 64 size 100k expire 15m
stick store-response res.cookie(ASP.NET_SessionId)
stick match req.cookie(ASP.NET_SessionId)
[...]
server s1 10.0.0.1:80 check
server s2 10.0.0.2:80 check
注意:您应该使用对等部分来保持数据在2个HAProxys之间以及重新加载配置时保持同步 注意2:expire参数应与您的应用程序cookie超时匹配
最后但同样重要的是,HAProxy将在日志行中向您报告基于cookie的持久性标志(了解带有cookie关键字的标志)。 这样,你就会知道请求的状态(有cookie,有效吗等等)以及HAProxy采取的行动(插入新的cookie等等)
您可以查看此博客页面以获取有关HAProxy的更多信息: http://blog.haproxy.com/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-you-need-to-know/
巴普蒂斯特