ProxyPassReverse 仅重写响应头字段,不处理主备切换或会话保持;需与 sticky session、后端路由标识(如 jvmRoute)、健康检查及共享 Session 存储协同工作才能保障会话不丢失。

ProxyPassReverse 本身不处理主备切换或会话保持,它只负责重写响应头中的 Location、Set-Cookie 等字段。要保证客户端会话在主备切换时不丢失,必须把 ProxyPassReverse 和会话粘性(sticky session)、后端路由标识、健康检查机制三者配合使用。
ProxyPassReverse 必须与主备配置同处一个 VirtualHost
无论后端是单节点还是主备集群,ProxyPassReverse 都必须和 ProxyPass 写在同一个
- 错误写法:ProxyPassReverse 放在全局配置或另一个虚拟主机里
- 正确写法:主备集群代理统一用 balancer:// 协议,ProxyPassReverse 指向同一 balancer URL
- 示例:
ProxyPass /app balancer://mycluster/app和ProxyPassReverse /app balancer://mycluster/app必须成对出现
靠 route + stickysession 实现会话绑定
Apache 不知道“哪个请求属于哪个用户”,必须依赖后端生成的会话 Cookie 中嵌入的路由标识(如 JSESSIONID=ABC123.server1),再由 ProxySet 的 stickysession 规则提取并绑定到对应节点。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 后端 Tomcat 需设置
jvmRoute="server1",让 Cookie 带上 .server1 后缀 - Apache 配置中 route 值必须与 jvmRoute 完全一致:
BalancerMember http://192.168.1.10:8080 route=server1 - 启用粘性:
ProxySet stickysession=JSESSIONID|jsessionid - 这样即使主节点宕机,只要备用节点能读取原有会话数据(如共享 Session 存储),用户刷新页面就不会重新登录
lbset 主备调度要配合健康检查和 retry
lbset=0 是主组,lbset=1 是备组,但 Apache 不会自动“把老会话迁过去”。只有当主组全部失效、且用户再次发起新请求时,才会被分发到备用组。所以会话不丢失的前提是:备用节点能识别并复用原会话 ID。
- 主组节点失效判断依赖健康检查(默认每 60 秒探活)和
retry=60参数 - 建议显式配置
ping=5(秒级心跳)和timeout=5,加快故障感知 - 备用节点必须部署相同应用、连接同一 Session 存储(Redis/Tomcat Cluster),否则拿到 JSESSIONID 也查不到会话内容
额外加固:透传真实 Host 和协议头
主备切换后,后端服务仍需生成正确的跳转 URL 和安全 Cookie,这依赖 Apache 正确注入原始上下文。
- 加
ProxyPreserveHost On:让后端看到 app.example.com,而非 127.0.0.1 - 加
RequestHeader set X-Forwarded-Proto "https" env=HTTPS:避免强制 HTTPS 的应用误判协议 - Set-Cookie 的 Domain 和 Secure 属性由后端控制,但 ProxyPassReverse 会自动将
Domain=192.168.1.10改为Domain=app.example.com,前提是 ProxyPassReverse 目标匹配正确

















