apache默认不保持会话,需配置stickysession绑定jsessionid等cookie并显式声明balancermember的route值,且后端cookie必须含.route后缀(如jsessionid=abc123.node1),否则粘性失效。

Apache 默认不做会话保持,请求会轮询分发到后端服务器,导致用户登录后刷新页面跳到无 Session 的节点而登出。要实现基于 Cookie 的 Sticky Session,核心是让 Apache 识别并依赖某个 Cookie 值(如 JSESSIONID 或自定义 ROUTEID),把同一客户端后续请求始终路由到同一台后端。
启用必要模块
确保以下模块已加载(在 httpd.conf 或配置文件中取消注释):
- mod_proxy.so
- mod_proxy_http.so(或 mod_proxy_ajp.so,如用 AJP)
- mod_proxy_balancer.so
- mod_headers.so(用于自动生成 Cookie,非必需但推荐)
配置 Balancer 与后端成员
每个后端必须显式声明 route 参数,且 route 值需与后端实际标识一致(如 Tomcat 的 jvmRoute):
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 route=server1
BalancerMember http://192.168.1.11:8080 route=server2
</proxy>
注意:route 值不能省略,也不能重复;若后端是 Tomcat,需在 server.xml 的
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
启用 stickysession 并指定 Cookie 名
在 ProxyPass 指令中加入 stickysession 参数,支持大小写变体和多候选名:
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid|ROUTEID
说明:
- Apache 不校验 Cookie 值是否合法,只提取其中的 .route 后缀部分(如 JSESSIONID=abc123.server1 → 匹配 server1)
- 若用自定义 Cookie(如 ROUTEID),需配合 mod_headers 自动注入:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Path=/; HttpOnly; Secure" env=BALANCER_ROUTE_CHANGED
该行表示:仅当首次分配 worker 时,Apache 主动下发 ROUTEID=.server1,浏览器后续携带此 Cookie 即可维持粘性。
验证与避坑要点
常见失效原因及应对:
- Cookie 被覆盖:后端应用(如 Spring Boot)主动设了同名 Cookie(如自己写 ROUTEID),会覆盖 Apache 注入的值 → 禁用后端该 Cookie 或改用唯一命名(如 CLUSTER_A_ROUTE)
- HTTPS 下缺少 Secure 标志:生产环境必须加 Secure 和 HttpOnly,否则现代浏览器拒绝发送
- 跨域或第三方 Cookie 限制:前端静态资源与 API 域名不一致时,Cookie 可能不携带 → 改用 URL 参数粘性(stickysession=ROUTEID|jsessionid;path=/;secure=on;scolon=on),并由后端重定向注入 ;jsessionid=xxx.server1
- 后端宕机触发重分配:某节点下线后,原绑定用户下次请求将重新负载 → 此时 Session 丢失,需搭配 Redis 共享 Session 或启用健康检查自动剔除










