HAproxy 1.5.8如何配置基于Cookie的粘性?

Van*_*ock 9 cookies sticky

我们的应用程序需要基于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
Run Code Online (Sandbox Code Playgroud)

前端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
Run Code Online (Sandbox Code Playgroud)

后端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
Run Code Online (Sandbox Code Playgroud)

后端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 }
Run Code Online (Sandbox Code Playgroud)

从HAProxy 1.5.8文档中我了解基于cookie的粘性是通过命令"appsession"实现的,但是我不理解其他命令所扮演的角色,比如"捕获cookie"或"棒表",它们是否有必要使用appsession?任何人都可以帮助我了解它们的工作原理,并建议您是否发现我们的配置有任何问题.

小智 25

首先,您能解释一下"不起作用"或您当前配置面临哪些问题?

您当前的配置中存在一些问题: - 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 棒表: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
    
    Run Code Online (Sandbox Code Playgroud)

注意:您应该使用peers部分来保持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-方知/

巴蒂斯特

  • haproxy 1.7它是req.cook和res.cook vs .cookie,如例子中所示 (5认同)