apache会话保持本质是请求“粘性”转发而非管理session;推荐启用stickysession,通过balancermember route标识与proxyset stickysession=routeid配合,由apache注入routeid cookie实现节点绑定,并建议同步配置tomcat jvmroute以利追踪。
apache 本身不生成或管理应用层 session,所谓“会话保持”是指让同一用户的 http 请求始终被转发到同一个后端服务器(比如 tomcat),避免登录态丢失、购物车清空等问题。核心不是 apache 存 session,而是让它按规则把请求“粘”住。
启用 stickysession(推荐方式)
这是最常用也最可控的方法,依赖 mod_proxy_balancer 模块,通过 Apache 自己注入和识别 Cookie 来绑定后端节点:
- 确保已加载
mod_proxy、mod_proxy_http和mod_proxy_balancer - 在
upstream配置中启用stickysession,并指定一个专属 Cookie 名(如ROUTEID):
BalancerMember http://192.168.1.10:8080 route=tomcat1
BalancerMember http://192.168.1.11:8080 route=tomcat2
ProxySet stickysession=ROUTEID - Apache 会在首次响应中自动设置
Set-Cookie: ROUTEID=tomcat1,后续请求携带该 Cookie,它就只往对应节点转发 - 这个 Cookie 和后端的
JSESSIONID完全无关,不会冲突
配合后端 Tomcat 的 jvmRoute 设置
虽然 Apache 不依赖 JSESSIONID 路由,但为防万一或调试需要,建议在每个 Tomcat 的 server.xml 中配置唯一标识:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
<engine></engine>标签里加上jvmRoute="tomcat1"(第二台写tomcat2) - 这样 Tomcat 生成的
JSESSIONID就变成类似abc123.tomcat1,便于日志追踪 - 同时统一设置
sessionCookiePath="/"和sessionCookieDomain=".example.com",防止多份 Cookie 并存
备选:基于源 IP 的哈希(简单但有局限)
如果用户基本固定、且不经过大型 NAT 或代理,可用 ip_hash 类似逻辑(Apache 无原生 ip_hash 指令,需用 mod_proxy_balancer + lbmethod=byrequests 配合自定义策略,但不如 stickysession 稳定):
- 实际更推荐 stickysession,因为 IP 可能变化(如移动网络切换)、多个用户共用出口 IP 时会挤到同一后端
- 若坚持用 IP,可借助
mod_headers和mod_rewrite提取并哈希REMOTE_ADDR,再映射到后端,但配置复杂、维护成本高
避免常见陷阱
很多问题其实出在细节没对齐:
- 不要让多个后端应用各自设不同
Cookie Path或Domain,否则浏览器可能存两份JSESSIONID,干扰路由判断 - 确认客户端真正收到了 Apache 注入的
ROUTEIDCookie,并在后续请求中带上了——可用浏览器开发者工具检查 Network → Request Headers - 如果后端用了 HTTPS,确保 Apache 的
ProxyPreserveHost On和证书信任链配置正确,否则 Cookie 可能被浏览器拒绝(尤其Secure属性)










