apache mod_proxy_balancer本身不管理应用层会话,仅通过stickysession或lbmethod=byrequests实现请求级会话保持;后端需配合redis等共享存储才能真正支持分布式会话迁移。
apache mod_proxy_balancer 本身不管理应用层会话(如 tomcat 的 httpsession),它只负责在请求转发层面实现会话保持(sticky session),即让同一客户端的后续请求尽可能打到同一个后端节点。所谓“分布式集群会话保持”,实际是两层配合:
-
前端代理层:用
mod_proxy_balancer绑定客户端与后端节点(靠 IP 或 Cookie); - 后端应用层:各节点需支持共享会话存储(如 Redis、Database、Hazelcast),否则即使请求落到同一台机器,重启或扩缩容仍会丢 session。
下面分三类典型场景说明配置要点,直击关键细节:
配置基于 Cookie 的会话保持(推荐用于 Java 应用)
适用于 Tomcat/JBoss 等默认使用 JSESSIONID 的场景,要求后端配置 jvmRoute 与 route= 值一致。
<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 / balancer://appcluster/
ProxyPassReverse / balancer://appcluster/
-
stickysession=JSESSIONID|jsessionid表示:从 Cookie 中提取JSESSIONID值,匹配.前缀(如abc123.server1→ 提取server1),再路由到对应route=的节点; - 后端 Tomcat 的
server.xml中必须设置<engine name="Catalina" defaulthost="localhost" jvmroute="server1"></engine>,否则route=不生效; - 若 Cookie 中无
.server1后缀(即未开启会话粘性写入),首次请求会轮询分配,之后才固定。
配置基于源 IP 的会话保持(无 Cookie 依赖)
适合静态资源、API 网关或无法控制后端 Cookie 格式的场景,但注意:NAT/CDN 下可能失效。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
<proxy>
BalancerMember http://192.168.1.10:8080 route=node1
BalancerMember http://192.168.1.11:8080 route=node2
ProxySet lbmethod=byrequests
ProxySet nofailover=on
</proxy>
-
lbmethod=byrequests是 Apache 2.4+ 中启用 IP 哈希的隐式方式(非iphash指令); -
nofailover=on关键:禁用故障转移,避免因某节点宕机导致请求跳到其他节点、破坏 IP 粘性; - 必须确保
RemoteIPHeader X-Forwarded-For和RemoteIPInternalProxy已配置,否则哈希基于代理 IP 而非真实客户端 IP。
启用 /balancer-manager 实时监控与人工干预
便于观察会话分布、临时下线异常节点、验证 sticky 是否生效。
<location>
SetHandler balancer-manager
Require ip 192.168.1.0/24
</location>
- 访问
http://your-domain.com/balancer-manager可看到每个BalancerMember的当前连接数、状态、route值; - 若发现某节点
Load异常高或Elected数远超其他节点,可手动点Disable,Apache 会自动将新请求切走,已有 sticky 连接不受影响(除非nofailover=off)。
后端集群真正实现“会话可迁移”,还得靠应用自己把 session 存到外部存储(比如 Spring Session + Redis),Apache 层只管路由不丢人。









