apache默认不保持session,需配置stickysession绑定jsessionid等cookie并显式声明balancermember的route值,且后端tomcat的jvmroute必须与route一致,否则请求轮询导致session丢失。

Apache 默认不保持 Session,请求会被轮询分发到不同后端,导致用户登录后刷新就登出。要让同一用户始终访问同一台后端服务器,关键不是“共享 Session”,而是做会话绑定(Sticky Session)——靠 Cookie 值把请求固定路由过去。
启用必要模块
确保以下模块已加载(检查 httpd.conf 或 mods-enabled 目录下对应配置):
- mod_proxy.so
- mod_proxy_http.so(或 mod_proxy_ajp.so,若走 AJP 协议)
- mod_proxy_balancer.so
- mod_headers.so(用于自动注入路由 Cookie,推荐启用)
配置后端节点并声明 route
每个 BalancerMember 必须显式指定 route 参数,且值需与后端实际标识一致:
<proxy balancer:> BalancerMember http://192.168.1.10:8080 route=server1 BalancerMember http://192.168.1.11:8080 route=server2 </proxy>
若后端是 Tomcat,还需在 server.xml 的 <engine></engine> 标签中设置:jvmRoute="server1" —— 这样它生成的 JSESSIONID 才会是 ABC123.server1 形式,Apache 才能正确提取后缀匹配。
开启 stickysession 并关联 Cookie
在 ProxyPass 指令中加入 stickysession 参数,支持大小写和多个备选名:
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid|ROUTEID
Apache 不校验 Cookie 值是否合法,只从中提取 .route 后缀部分(例如 JSESSIONID=xyz.server2 → 匹配 server2)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
如果后端不自动带 route 后缀,建议用 mod_headers 让 Apache 主动下发路由 Cookie:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Path=/; HttpOnly; Secure" env=BALANCER_ROUTE_CHANGED
这行表示:仅当首次分配后端节点时,Apache 自动写入 ROUTEID=.server1,浏览器后续携带该 Cookie,就能维持粘性。
注意 Cookie 路径与域名一致性
若 Apache 反向代理路径与后端应用 ContextPath 不一致(比如外网访问 /,后端实际部署在 /portal),Tomcat 会因 Cookie Path 不匹配而重写 JSESSIONID,造成 Session 丢失。
此时必须添加路径映射指令:
ProxyPassReverseCookiePath /portal / ProxyPassReverseCookieDomain localhost www.example.com
确保浏览器发送的 Cookie 路径与后端期望的一致,否则粘性会失效。










