Apache实现会话粘滞的关键是基于JSESSIONID Cookie的stickysession机制:Tomcat端配置唯一jvmRoute(如node1),Apache端ProxySet stickysession=JSESSIONID|jsessionid并匹配相同route值,确保同一用户后续请求始终路由至同一后端。

Apache 中配置 StickySession 实现会话保持,关键是让同一用户后续请求始终落到同一台后端 Java 服务器(如 Tomcat),避免登录态丢失。最常用、兼容性最好的方式是基于 JSESSIONID Cookie 的粘性路由,它不依赖应用改造,只需 Apache 和 Tomcat 两端配置对齐。
Tomcat 端必须配 jvmRoute
这是整个粘性机制的起点。Apache 要靠它从 JSESSIONID 中识别路由目标:
- 打开 Tomcat 的 conf/server.xml,找到
<Engine>标签,添加或确认jvmRoute属性,值需唯一且与 Apache 中声明的 route 一致 - 例如:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> - 若部署多个 Tomcat 实例,每个实例的
jvmRoute必须不同(如node1、node2) - 确保
sessionCookiePathUsesTrailingSlash="false"(尤其 Spring Boot 应用),避免 Cookie 路径识别异常
Apache 端启用模块并配置 Balancer
Apache 需加载必要模块,并在 <Proxy> 块中明确定义节点与粘性规则:
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
- 启用三个核心模块:
mod_proxy、mod_proxy_balancer、mod_proxy_http(或mod_proxy_ajp,若走 AJP 协议) - 在虚拟主机或主配置中写入:
<Proxy "balancer://mycluster"><br> BalancerMember http://192.168.1.10:8080 route=node1<br> BalancerMember http://192.168.1.11:8080 route=node2<br> ProxySet stickysession=JSESSIONID|jsessionid<br> </Proxy>
-
stickysession=JSESSIONID|jsessionid中的竖线表示大小写兼容,防止因首字母大小写导致匹配失败 - 搭配
nofailover=Off(默认),允许原节点宕机时自动切到其他节点,避免用户直接报错
可选:主动下发 ROUTEID Cookie 增强兼容性
当用户首次访问无 JSESSIONID(比如 URL 中没带 ;jsessionid=xxx),或部分客户端禁用 Cookie 时,可由 Apache 主动注入路由标识:
- 在
<Proxy>块内加一行:Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED - 这会在用户第一次被分配到某节点时,设置一个
ROUTEIDCookie,Apache 后续优先读取它来维持粘性 - 该机制与 JSESSIONID 并存,互为补充,不冲突
验证与避坑要点
配置完别急着上线,重点检查这几项:
- 用浏览器开发者工具查看响应头,确认 Set-Cookie 中的 JSESSIONID 包含
.node1这样的后缀(如JSESSIONID=ABC123.node1) - 反复刷新页面,观察请求是否稳定落在同一台后端 IP 上(可通过后端日志或
curl -I查看X-Forwarded-For和实际处理 IP) - 禁用 sticky session 测试对比:临时注释
ProxySet stickysession,确认登录后跳转会话丢失,反向验证粘性生效 - 注意前端是否有 CDN 或 Nginx:若真实 IP 被覆盖,
iphash方式会失效;但基于 Cookie 的 sticky 不受影响

















