Apache会话保持需后端返回含.route后缀的Cookie(如JSESSIONID=abc.node1)并由mod_proxy_balancer匹配route标识绑定节点,仅设stickysession=JSESSIONID无效;必须为BalancerMember显式配置route=node1等,且Tomcat需设jvmRoute一致,或由Apache用Header注入ROUTEID Cookie实现解耦粘性。
apache 本身不生成会话 id,会话保持靠 mod_proxy_balancer 识别后端返回的路由标识(如带 .node1 后缀的 jsessionid),再将同一标识的请求固定转发到对应后端节点。核心是“路由绑定 + cookie 隔离”,不是简单开启 sticky 就能生效。
启用必要模块并声明负载均衡集群
确保以下模块已加载(在 httpd.conf 或 proxy.conf 中取消注释):
mod_proxy-
mod_proxy_http(或mod_proxy_ajp,视后端协议而定) mod_proxy_balancer-
mod_headers(用于注入路由 Cookie)
然后定义一个带 route 标识的后端集群:
<proxy>
BalancerMember http://192.168.1.10:8080 route=node1
BalancerMember http://192.168.1.11:8080 route=node2
</proxy>
配置 stickysession 并绑定 route 参数
关键点:仅写 stickysession=JSESSIONID 不够,必须配合 route 属性才能完成绑定。
在 ProxyPass 指令中明确指定:
ProxyPass /app balancer://mycluster stickysession=JSESSIONID|jsessionid
注意:
- | 表示支持大小写不敏感匹配(如 JSESSIONID 和 jsessionid)
- Apache 会自动从 Cookie 值中提取 .node1 这样的后缀,并匹配对应 route 的 BalancerMember
让 Tomcat 自动打上 route 标签
后端 Tomcat 必须在 conf/server.xml 的 <engine></engine> 节点中设置 jvmRoute:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
<engine name="Catalina" defaulthost="localhost" jvmroute="node1"></engine>
这样它生成的会话 Cookie 就是:Set-Cookie: JSESSIONID=abc123.node1
Apache 读到 .node1 后缀,就只往 route=node1 的节点转发。
若多个 Tomcat 实例,每个都要配不同 jvmRoute(如 node2、node3),且名称需与 BalancerMember route=xxx 完全一致。
可选:由 Apache 主动注入独立路由 Cookie(更可靠)
避免依赖后端 Cookie,推荐用 Apache 自己发一个专用路由 Cookie(如 ROUTEID),与 JSESSIONID 完全解耦:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Path=/; HttpOnly; Secure" env=BALANCER_ROUTE_CHANGED
ProxyPass /app balancer://mycluster stickysession=ROUTEID
这样即使后端没配 jvmRoute 或 Cookie 被覆盖,Apache 仍能靠自己种的 ROUTEID 维持粘性。









