haproxy基于cookie的会话保持需在mode http下配置,通过cookie指令实现:insert写入、nocache防缓存、indirect避免重写,并为每台后端服务器指定唯一cookie值以确保请求路由一致性。

HAProxy 实现基于 Cookie 的会话保持,核心是让同一浏览器的多次请求始终被转发到同一台后端服务器,从而保障有状态应用(如登录态、购物车)的连续性。这必须在 mode http(七层)下配置,TCP 四层模式不支持。
必须启用 HTTP 模式并定义 Cookie 行为
在 backend 或 listen 段中,添加 cookie 指令控制会话绑定逻辑:
-
cookie <name> insert nocache indirect</name>是最常用组合-
<name></name>:自定义 Cookie 键名(如WEBCOOKIE),客户端后续请求携带该键值,HAProxy 依此路由 -
insert:首次响应时由 HAProxy 主动写入Set-Cookie头,值为后端指定的标识 -
nocache:禁止 CDN 或代理缓存带该 Cookie 的响应,避免多个用户被错误分发到同一后端 -
indirect:若客户端已携带该 Cookie,HAProxy 不再重写或覆盖,提升安全性
-
为每个后端服务器分配唯一 Cookie 值
每台后端 server 行需附加 cookie <value></value> 参数:
-
server web1 192.168.0.10:80 cookie web1 check -
server web2 192.168.0.20:80 cookie web2 check
这样 HAProxy 就能把WEBCOOKIE=web1的请求固定导向web1,WEBCOOKIE=web2导向web2。
配置示例(精简可用)
listen webcluster
bind *:80
mode http
balance roundrobin
cookie WEBCOOKIE insert nocache indirect
server web1 192.168.0.10:80 cookie web1 check inter 3s fall 3 rise 5
server web2 192.168.0.20:80 cookie web2 check inter 3s fall 3 rise 5
注意事项
- 不要和
balance source混用,二者目标冲突 - 若前端有 CDN 或反向代理,务必保留
nocache,否则缓存可能污染路由 - 浏览器级隔离:Firefox 和 Chrome 各自保存独立 Cookie,可分别绑定不同后端;同一浏览器内刷新/新标签仍维持原节点
- 该方案适合中小规模或遗留系统;现代架构更倾向后端 Session 共享(如 Redis),而非依赖负载均衡器做粘性调度
不复杂但容易忽略










