haproxy的cookie黏性配置必须置于backend段且仅在mode http下生效;mode tcp会静默忽略,需配合cookie serverid insert nocache indirect及各server的对应cookie值才能实现稳定会话保持。

cookie 配置必须放在 backend 段,且只在 mode http 下生效 —— 四层 mode tcp 直接忽略该指令,不会报错但也不起作用。
必须用 mode http,否则 cookie 黏性完全无效
-
frontend或defaults中写cookie指令会被静默忽略(HAProxy 不校验语法位置,只在 backend 解析) - 如果后端是 HTTPS 服务但 HAProxy 终止 SSL,则仍属七层,可用
cookie;若仅做 TCP 透传(如 TLS passthrough),则必须切回mode tcp,此时无法用 cookie,得换stick-table或源 IP 哈希 - RHEL9.3 默认启用
http-request set-var等高级策略,但不影响基础cookie指令,只要没禁用option http-server-close类参数即可
cookie 指令的三个核心组件不能漏
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
backend行必须带cookie <name> insert nocache indirect</name>:其中<name></name>是客户端看到的 Cookie 键名(如SERVERID),insert表示首次响应时注入,nocache防 CDN/代理缓存错误路由,indirect避免重复下发已存在的 Cookie - 每个
server行必须带cookie <value></value>:这个<value></value>是后端节点唯一标识(如web1),和上面<name></name>无关,但必须一一对应 - 示例配置片段:
backend webapp mode http balance roundrobin cookie SERVERID insert nocache indirect server web1 192.168.10.11:8080 cookie web1 check server web2 192.168.10.12:8080 cookie web2 check
常见失效场景和验证方法
- curl 测试时没带
-b和-c,看不到 Cookie 轮转:用curl -v -c /tmp/cookie.txt @#@#@#@#@#@#@#@#@#@0发第一次请求,再用curl -b /tmp/cookie.txt @#@#@#@#@#@#@#@#@#@0发第二次,观察后端日志或响应头中X-Forwarded-For是否固定 - 后端应用自己也设了同名 Cookie(如
PHPSESSID),覆盖了 HAProxy 的SERVERID:检查响应头里是否出现两个Set-Cookie,优先级以 HAProxy 插入的为准,但浏览器可能按顺序取第一个 -
option forwardfor没开,后端拿不到真实 IP,误判为新会话:虽不影响 cookie 路由,但日志排查时容易混淆,建议始终开启 -
redispatch未启用,后端宕机后旧 Cookie 请求持续 503:加一行option redispatch在 backend 里,让 HAProxy 在节点失败时主动重选(注意这会破坏“绝对黏性”,但提升可用性)
真正容易被忽略的是 nocache 和 indirect 的协同效果
- 单独用
nocache只防中间缓存污染,但若用户刷新页面或重发请求,HAProxy 仍可能重写 Cookie;加上indirect才确保“已有 Cookie 就不碰”,这才是生产环境稳定的组合 - RHEL9.3 的 SELinux 默认策略对
/var/lib/haproxy有严格控制,如果启用了stick-table日志或持久化,cookie本身虽不依赖磁盘,但健康检查日志路径若配错,会导致check失败进而误判节点下线 —— 这会让黏性看起来“突然断掉”










