Haproxy会话保持:基于Cookie优化

说明

  • 在仅使用 balance source 时,HAProxy 会基于客户端源 IP 做哈希,能保证同一台机器(相同出口 IP)的多个请求大概率落到同一后端,但不能区分同一机器的不同浏览器或不同浏览器的不同会话。
  • 使用基于 cookie 的会话保持,可以在浏览器级别实现"会话粘性":同一浏览器(同一 Cookie)会话会被路由到同一后端,而不同浏览器可被路由到不同后端。

示意图(已保留原图):

外链图片转存中...(img-eGUb2nyi-1769333492187)

配置示例(在 haproxy.cfg 中):

haproxy 复制代码
listen webcluster
    bind        *:80
    balance     roundrobin
    hash-type   consistent

    # 在响应中插入名为 WEBCOOKIE 的 cookie(由 HAProxy 插入)
    # insert : 当后端未设置 cookie 时由 HAProxy 插入
    # nocache : 指示浏览器不要缓存带有此 cookie 的页面
    # indirect : 客户端的 cookie 不会覆盖 server 的 cookie(更安全)
    cookie WEBCOOKIE insert nocache indirect

    # 每个 server 指定其 cookie 名称(用于标识该 server)
    server haha 192.168.0.10:80 cookie web1 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.0.20:80 cookie web2 check inter 3s fall 3 rise 5 weight 1

说明各项含义

  • cookie insert:当后端响应中没有该 cookie 时,HAProxy 会插入名为 <name> 的 cookie。
  • server ... cookie :给每个后端指定一个 cookie 值(如 web1、web2),HAProxy 会把该值写入客户端 cookie,用于后续请求路由。
  • nocache:提示浏览器或中间缓存不要缓存带有该 cookie 的响应。
  • indirect:禁止客户端通过设置 cookie 来直接影响后端选择(更安全);有 rewrite、indirect 等其它选项,可根据需求选用。
  • hash-type consistent:如果配合 hash 类算法,建议使用一致性哈希以减小节点变更时抖动;这里对 cookie 保持不是必须项,但保留可提升稳定性。

测试方法(浏览器)

  • 打开两个不同浏览器(例如 Firefox、Edge),访问 haproxy 的前端 URL:
    • 你会看到每个浏览器被固定到某个后端(因浏览器分别保存各自的 cookie)。
  • 在同一浏览器中打开新标签��或刷新,应保持在同一后端(相同 cookie)。

示例截图(保留原实验截图):

  • Firefox(示例)

    外链图片转存中...(img-Gy1q4eVU-1769333492188)

  • Edge(示例)

    外链图片转存中...(img-hJjMfDBE-1769333492188)

其它注意事项与扩展

  • 后端应用本身若也设置了相同名称的 cookie(例如会话 cookie),需注意命名冲突或选择 cookie <name> prefix|rewrite 等策略进行配合。
  • 若需要更严格的安全(HTTPS、Secure、HttpOnly��,可在后端或通过 HAProxy 设置相关响应头/cookie 属性(例如通过 http-response set-cookie 或在后端直接设置)。
  • 若想在 HAProxy 层面把已有后端 cookie 用作路由依据(而非 HAProxy 插入),可以使用 cookie 的 preserve/rewrite 等选项或使用 stick 表(stick-table + stick on cookie)来实现更复杂的粘性策略。
  • 对于需要跨子域或设置路径的情况,请注意 cookie 的 Domain / Path 属性(通常由后端或 response header 指定)。

常见故障排查

  • 浏览器不保存 cookie:检查请求与响应头(Set-Cookie)、是否有 SameSite/Domain/Path/secure 限制、是否在 HTTP(非 HTTPS)下被浏览器策略阻止。
  • 插入 cookie 无效:确认 haproxy 配置中的 cookie 行语法正确,且配置已重载:systemctl restart haproxy 或 haproxy -f /etc/haproxy/haproxy.cfg -c 校验。
  • 多级代理或缓存:如果请求经过代理或缓存,可能会影响 cookie 的传递,应排查中间路径上的行为。

示例验证命令(命令行)

  • 使用 curl 查看 Set-Cookie:
    curl -I http:///
  • 使用 curl 带 cookie 请求:
    curl -b "WEBCOOKIE=web1" http:///

结束语

  • 本方法适合对"同一浏览器会话"实现粘性路由,使用简单直观;若需要跨设备或更复杂的会话管理,可考虑结合 stick-table、session 存储或应用端会话同步。
相关推荐
打工仔折腾 AI8 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz8 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
‎ദ്ദിᵔ.˛.ᵔ₎8 小时前
关于Linux 线程局部存储的认识
linux·运维
GlobalInfo8 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
隔窗听雨眠10 小时前
KingbaseES平替全链路实践:从迁移评估到可持续运维
运维
skywalk816310 小时前
登到192.168.1.5那台机器,看看今天白天,大约从早晨到晚上,都卡住了。看看因为什么卡住,为什么卡住而没有杀死那个导致卡死的进程,为什么
运维·系统·freebsd
运维行者_10 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
晚风吹北巷12 小时前
Linux复习篇(自用)
linux·运维·服务器·1024程序员节
风哥2号12 小时前
数据库教程FGMT69:PostgreSQL运维诊断与监控分析
运维·数据库·postgresql
Harrison Ben13 小时前
(原创)SAP FI自动入账奥义:FBKP FBKA FBKF
运维·sap·sap fico·sap运维·sap 实施