要让 Apache 在负载均衡中保持用户始终访问同一台后端服务器,核心是启用 stickysession 参数,并确保它能正确识别和绑定会话标识。

要让 Apache 在负载均衡中保持用户始终访问同一台后端服务器,核心是启用 stickysession 参数,并确保它能正确识别和绑定会话标识。这不是自动生效的功能,需要配合模块、Cookie 名称和后端服务约定共同完成。
确认并启用必要模块
Apache 必须加载以下三个基础代理模块,缺一不可:
- mod_proxy.so —— 提供反向代理基础能力
- mod_proxy_balancer.so —— 支持负载均衡集群定义
- mod_proxy_http.so(或 mod_proxy_ajp.so)—— 决定与后端通信协议(HTTP 或 AJP)
检查 httpd.conf 或 apache2.conf 中对应 LoadModule 行未被注释。Ubuntu 系统可运行 a2enmod proxy proxy_balancer proxy_http 启用。
定义集群并设置 stickysession 参数
在 <proxy balancer:></proxy> 块中为每个后端节点指定 route,同时在 ProxyPass 指令中声明 stickysession:
审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他
<Proxy balancer://mycluster> BalancerMember http://192.168.1.10:8080 route=node1 BalancerMember http://192.168.1.11:8080 route=node2 </Proxy> ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=Off ProxyPassReverse / balancer://mycluster/
关键细节:
-
route值必须与后端应用(如 Tomcat 的jvmRoute)严格一致,Apache 靠它匹配 Cookie 中的路由标识 -
stickysession后填写的 Cookie 名(如JSESSIONID)需与实际应用生成的会话 Cookie 名完全匹配;建议大小写变体用|分隔,防止客户端修改首字母 -
nofailover=Off表示当原节点宕机时,允许将请求转发到其他节点(避免用户直接报错),设为On则强制粘性、不切换
确保后端服务支持路由标识
仅 Apache 配置不够,后端服务也需输出带 route 的会话 Cookie:
-
Tomcat:在
server.xml的<engine></engine>标签中添加jvmRoute="node1",这样它生成的JSESSIONID就会形如ABC123.node1 -
Java 应用(非 Tomcat) 或 PHP:若使用自定义会话 ID(如
PHPSESSID),需自行在响应头中附加route信息,或改用mod_headers模块重写Set-Cookie头 - 多套集群共用域名时,务必为每套集群分配独立 Cookie 名(如
CLUSTER_A_SESSION),避免作用域冲突
验证与调试方法
配置完成后重启 Apache,通过以下方式确认粘性是否生效:
- 访问应用并登录,用浏览器开发者工具查看响应头中的
Set-Cookie,确认值含.node1或类似后缀 - 多次刷新页面,观察响应内容是否始终来自同一台后端(例如返回固定版本号或 IP 标识)
- 打开
/balancer-manager管理界面(需显式启用),查看各节点的“Route”列及当前活跃会话数 - 临时关闭一台后端,观察用户是否断连(
nofailover=On)或自动迁移(nofailover=Off)

















