apache实现粘性会话的关键是启用stickysession参数并确保模块、集群route与后端jvmroute三者严格匹配,同时后端需在cookie中注入route标识(如jsessionid.node1),缺一不可。

Apache 要实现后端负载均衡下的粘性会话(Session Affinity),关键不是“自动记住用户”,而是通过 识别并绑定会话标识,让同一客户端后续请求始终落到同一台后端服务器。这需要 Apache 模块、集群定义、后端配合三者协同,缺一不可。
启用必要模块
确保以下三个模块已加载且未被注释:
- mod_proxy.so:提供反向代理基础能力
- mod_proxy_balancer.so:支持负载均衡集群管理
- mod_proxy_http.so(或 mod_proxy_ajp.so):决定与后端通信协议(HTTP 或 AJP)
在 Ubuntu/Debian 系统中可直接运行:
a2enmod proxy proxy_balancer proxy_http
CentOS/RHEL 则检查 httpd.conf 中对应 LoadModule 行是否启用。
定义集群并配置 stickysession
在虚拟主机或主配置中添加如下结构:
<proxy balancer:>
BalancerMember http://192.168.1.10:8080 route=server1
BalancerMember http://192.168.1.11:8080 route=server2
</proxy>
ProxyPass / balancer://myapp/ stickysession=JSESSIONID|jsessionid nofailover=Off
ProxyPassReverse / balancer://myapp/
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
route=server1必须与后端服务输出的路由标识严格一致(如 Tomcat 的jvmRoute) -
stickysession=JSESSIONID|jsessionid表示优先匹配大写 Cookie 名,失败则尝试小写——防止浏览器或中间件修改首字母导致匹配失败 -
nofailover=Off允许节点宕机时切换到其他可用后端(避免用户直接报错);设为On则强制粘性、不切换
后端服务需输出带 route 的会话 Cookie
仅 Apache 配置无法生效,后端必须在响应头中注入含路由信息的会话 ID:
-
Tomcat:在
server.xml的<engine></engine>标签中添加jvmRoute="server1",它会自动将JSESSIONID写成ABC123.server1 -
非 Tomcat Java 应用或 PHP:若使用自定义会话名(如
PHPSESSID),需在应用层响应头中手动附加 route,或用mod_headers重写Set-Cookie,例如:
Header edit Set-Cookie ^(PHPSESSID=[^;]+) $1.server1 - 多套集群共用域名时,务必为每套使用独立 Cookie 名(如
CLUSTER_A_JSESSIONID),避免冲突
验证是否生效
配置完成后重启 Apache,通过浏览器开发者工具(Network → Response Headers)检查登录后的响应头:
- 确认
Set-Cookie值包含.server1或.server2后缀 - 刷新页面或发起新请求,观察是否持续命中同一后端 IP(可通过后端日志或
curl -I查看X-Forwarded-For或自定义响应头判断) - 临时停掉一台后端,观察用户是否短暂中断后恢复(
nofailover=Off下应能继续访问,但 Session 可能丢失)
不复杂但容易忽略:粘性会话本身不解决 Session 宕机丢失问题,如需高可用,需叠加 Redis 共享 Session 或启用后端 Session 复制机制。










