apache的会话保持实为负载均衡下的会话粘滞,通过stickysession识别jsessionid或route等标识,结合后端tomcat的jvmroute配置,确保同一用户请求始终路由至同一节点。
apache 本身不直接管理应用层会话(如 java session 或 php session),它的“会话保持”实际指负载均衡场景下的会话粘滞(session stickiness)——确保同一用户的后续请求持续转发到后端同一台 tomcat 或应用服务器,避免因会话丢失导致登录失效、购物车清空等问题。
明确会话保持的实现层级
Apache 是反向代理/负载均衡器,不是应用容器。真正的会话数据由后端服务(如 Tomcat、Spring Boot)生成和维护。Apache 的作用是:在多个后端节点间分发请求时,识别用户标识(如 Cookie 或 URL 参数),并按规则固定路由。
常见识别依据包括:
- JSESSIONID Cookie:Tomcat 默认写入的会话 ID,Apache 可提取并哈希绑定后端节点
- 自定义 Cookie(如 ROUTEID):由后端主动下发,Apache 用它做路由标签
- 客户端 IP 地址:简单但不推荐(NAT 环境下大量用户共享 IP,易倾斜)
使用 mod_proxy_balancer + sticky cookie(推荐方式)
这是 Apache 2.4+ 最标准、最可控的方案,无需额外模块,仅启用内置模块即可。
配置示例(httpd.conf 或虚拟主机中):
<proxy>
BalancerMember http://192.168.1.10:8080 route=node1
BalancerMember http://192.168.1.11:8080 route=node2
ProxySet stickysession=ROUTE
</proxy>
ProxyPass "/app" "balancer://mycluster/app"
ProxyPassReverse "/app" "balancer://mycluster/app"
关键点说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
route=node1必须与后端 Tomcat 的jvmRoute配置一致(在 conf/server.xml 的<engine></engine>标签中设置:jvmRoute="node1") -
stickysession=ROUTE表示 Apache 会读取名为ROUTE的 Cookie 值(如ROUTE=node1),并匹配对应route - Tomcat 自动在重定向和 Cookie 中附加
jsessionid后缀;jsessionid=xxx.node1,Apache 能自动解析该后缀中的node1并完成粘滞 —— 这就是为什么常设stickysession=JSESSIONID也能工作
配合 Tomcat 正确启用 jvmRoute 和集群标识
若未配置 jvmRoute,Apache 无法识别节点归属,粘滞将失效。
在每台 Tomcat 的 conf/server.xml 中修改 <engine></engine> 标签:
<engine name="Catalina" defaulthost="localhost" jvmroute="node1"></engine>
注意:
- 各节点
jvmRoute值必须唯一且与 Apache 中route=xxx完全一致 - 同时建议开启
useRelativeRedirects="false",确保重定向 URL 包含完整路径,避免前端代理头丢失 - 如需跨节点共享会话(非粘滞),则需 Redis 或 DeltaManager 集群方案,但那是另一套机制,不替代粘滞本身
可选增强:健康检查与故障转移
粘滞不能解决节点宕机问题。应启用基本健康探测,让 Apache 自动剔除异常节点:
<proxy>
BalancerMember http://192.168.1.10:8080 route=node1 status=+H
BalancerMember http://192.168.1.11:8080 route=node2 status=+H
ProxySet stickysession=ROUTE
ProxySet lbmethod=byrequests
ProxySet timeout=5
</proxy>
其中 status=+H 表示启用心跳检测(默认对 / 发起 HEAD 请求),失败三次后标记为 Down;lbmethod=byrequests 是默认轮询策略,也可用 bytraffic 或 heartbeat(需启用 mod_lbmethod_heartbeat)。










