apache实现会话保持的核心是粘性路由,即通过jsessionid cookie识别并绑定用户至指定tomcat节点,需确保apache的route值与tomcat的jvmroute严格一致,并启用mod_proxy、mod_proxy_balancer等模块配置stickysession。

Apache 本身不管理 Java 应用的 session,它只负责把请求分发到后端 Tomcat 实例。要在集群环境下实现会话保持,关键不是“让 Apache 存 session”,而是让 Apache 能识别并维持用户与某个 Tomcat 节点的绑定关系。最常用、最稳妥的方式是基于 JSESSIONID Cookie 的粘性会话(Sticky Session),配置集中在 httpd.conf 或虚拟主机配置块中。
启用必要模块
确保以下模块已加载(取消注释或添加):
-
mod_proxy:提供代理基础能力 -
mod_proxy_http或mod_proxy_ajp:用于 HTTP 或 AJP 协议转发 -
mod_proxy_balancer:支持负载均衡和会话保持逻辑 -
mod_slotmem_shm(推荐):为 balancer 提供共享内存支持,避免重启后会话路由丢失
配置 Balancer 和 sticky session
在 httpd.conf 或 <virtualhost></virtualhost> 内添加如下结构:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<proxy>
BalancerMember http://192.168.1.10:8080 route=server1
BalancerMember http://192.168.1.11:8080 route=server2
ProxySet stickysession=JSESSIONID|jsessionid
</proxy>
ProxyPass "/app" "balancer://mycluster/app"
ProxyPassReverse "/app" "balancer://mycluster/app"
注意:route 值必须与后端 Tomcat 的 jvmRoute 完全一致。例如 Tomcat 的 server.xml 中需有:<engine name="Catalina" defaulthost="localhost" jvmroute="server1"></engine>
增强 Cookie 可靠性(可选但推荐)
有些场景下 JSESSIONID 可能未携带 route 后缀(如 URL 重写失效或前端拦截),可主动下发路由标识 Cookie:
- 在
<proxy></proxy>块外或<virtualhost></virtualhost>中添加:Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Path=/; HttpOnly" env=BALANCER_ROUTE_CHANGED - 同时更新
ProxySet:ProxySet stickysession=ROUTEID|routeid
验证与调试要点
配置生效后需确认三点:
- 访问应用时响应头是否含
Set-Cookie: JSESSIONID=xxx.server1或ROUTEID=.server1 - 刷新页面,请求是否始终落在同一台 Tomcat(查其 access_log 或加简单 JSP 输出
request.getRemoteAddr()) - 关闭某台 Tomcat 后,带有效 JSESSIONID 的请求是否被自动切到另一台(需配合 Tomcat 层 session 复制才真正容错)










