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

问题描述 投票:9回答:2

我们的应用程序需要基于cookie的粘性会话,因此我们想使用HAproxy平衡进入IIS服务器场的传入流量。

我们正在使用以下配置,该配置似乎可以在实验室中使用(循环工作正常,并且保留了会话),但是当应用于具有3k以上并发用户的生产中时失败:

frontend Front_http

bind :80
mode http
default_backend backend_http
stats enable
capture cookie ASP.NET_SessionId len 32
maxconn 10000

frontend 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

后端后端_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”或“ stick-table”之类的角色时是否需要所有使用appsession时?谁能帮助我了解它们的工作原理,并建议您是否发现我们的配置有任何问题。

cookies sticky
2个回答
27
投票

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

当前配置中存在一些问题:-appsession粘性不会抵抗重新加载。这意味着每次重新加载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
    
  • stick table: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
    

注意:您应该使用对等部分来保持两个HAProxy之间以及重新加载配置时的数据同步注意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/

洗礼池


0
投票

问题:我们可以使用两种方法进行粘贴吗?因此,基于cookie的粘性,然后将Ip作为后备来源?

© www.soinside.com 2019 - 2024. All rights reserved.