Apache基于Cookie实现会话粘滞需前后端协同:配置balancer的stickysession参数并匹配后端route(如Tomcat的jvmRoute),或由Apache主动注入ROUTEID Cookie;务必确保路由标识一致、避免同名Cookie冲突,并验证Set-Cookie响应头及请求路由稳定性。
在 Apache 中实现基于 Cookie 的会话粘滞(Sticky Session),核心是让负载均衡器识别并依赖客户端携带的特定 Cookie,将同一用户的请求持续路由到同一后端节点。这不需要后端共享会话数据,部署轻量、见效快,但需前后端配置严格对齐。
在 <Proxy balancer://xxx> 块中为每个后端成员指定 route,并在 ProxyPass 指令中声明 stickysession:
jvmRoute="node1")stickysession=JSESSIONID|jsessionid 表示 Apache 会尝试从这些 Cookie 名中提取值,再按 .node1 这样的后缀匹配路由| 分隔,避免因客户端修改首字母导致匹配失败仅 Apache 配置不够,后端必须生成含路由信息的会话 ID:
server.xml 的 <Engine> 标签中添加 jvmRoute="node1",使 JSESSIONID 变为 ABC123.node1
Set-Cookie: JSESSIONID=xxx.node1
mod_headers 重写 Set-Cookie 头,或直接在业务代码中附加 .node1
当不希望依赖后端生成的 JSESSIONID,或存在命名冲突时,推荐用独立 Cookie 名(如 ROUTEID),由 Apache 自动注入:
mod_headers 模块Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Path=/; HttpOnly; Secure" env=BALANCER_ROUTE_CHANGED
ROUTEID=.node1 即可维持粘性CLUSTER_A_ROUTE
配置生效后,通过浏览器开发者工具检查响应头中的 Set-Cookie:
.node1 或 .node2 后缀nofailover=Off,允许节点宕机时自动切换,避免用户请求直接失败