apache会话保持通过stickysession指令配合jsessionid等cookie实现,确保同一用户请求始终路由至首次处理的后端服务器;需为每个balancermember显式配置route,并使cookie值与route一致。
apache 负载均衡通过会话保持固定后端节点,核心是让同一用户后续请求始终路由到最初处理它的那台后端服务器。这主要靠 stickysession 指令配合 cookie(如 jsessionid)或自定义路由标识实现,不是靠 ip 哈希——后者在 nat、cdn 等场景下容易失效。
配置 stickysession 实现基于 Cookie 的粘性会话
这是最常用、也最可靠的方式,尤其适用于 Tomcat/JBoss 等 Java 应用。
- 确保后端应用(如 Tomcat)已正确生成并返回
JSESSIONIDCookie(默认开启) - 在
<proxy></proxy>块中设置stickysession=JSESSIONID,Apache 会自动解析该 Cookie 的值,并匹配对应route - 每个
BalancerMember必须显式指定route=xxx,且该 route 值需与实际后端返回的 JSESSIONID 路由部分一致(例如JSESSIONID=ABC123.backend1中的backend1) - 示例配置片段:
BalancerMember "http://192.168.1.50:8080" route=backend1
BalancerMember "http://192.168.1.51:8080" route=backend2
ProxySet stickysession=JSESSIONID|jsessionid
ProxyPass "/" "balancer://myapp/"
ProxyPassReverse "/" "balancer://myapp/"
让 Apache 主动注入和维护路由标识
当后端不自带 route 后缀(比如纯 HTTP 服务),可由 Apache 自行注入 Cookie 来建立绑定关系。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 使用
Header add Set-Cookie指令,在首次响应中写入带BALANCER_WORKER_ROUTE的 Cookie - 配合
env=BALANCER_ROUTE_CHANGED,只在路由切换时写入,避免重复覆盖 - 需要启用
mod_headers和mod_proxy_balancer - 示例:
BalancerMember "http://192.168.1.50:80" route=1
BalancerMember "http://192.168.1.51:80" route=2
ProxySet stickysession=ROUTEID
关键细节与常见问题
配置生效依赖几个不可省略的环节:
-
route=xxx必须写在每个BalancerMember行内,不能只靠域名推断 -
stickysession必须写在之前,作用于整个集群;不支持写在BalancerMember行末 - 若用
JSESSIONID,后端返回的 Cookie 建议包含路径后缀(如backend1),否则 Apache 默认按完整值匹配,可能失败 - WebSocket 长连接同样依赖此机制,必须保证单次连接生命周期内始终落在同一节点,否则会话中断
- 故障转移时,sticky 会话不会自动漂移;如需容错,应结合 session 共享(如 Redis)或无状态设计
验证是否生效
最直接的方法是观察请求日志和 Cookie 行为:
- 首次访问时,检查响应头是否含新 Cookie(如
ROUTEID=.1或JSESSIONID=xxx.backend1) - 后续请求带上该 Cookie,查看 Apache 访问日志中
%{BALANCER_WORKER_ROUTE}e变量是否稳定输出同一 route 值 - 对比各后端服务器的访问日志,确认同一浏览器的多次请求集中出现在某一台上










