Apache不直接共享长连接,而是通过stickysession实现会话粘滞,确保同一用户始终路由至同一后端节点;同时需后端(如Redis或Tomcat集群)同步用户上下文、登录态等状态,以保障长连接业务连续性。
Apache 本身不直接“共享”长连接,而是通过会话粘滞(sticky session)+ 后端应用层状态同步来保障长连接场景下的业务连续性。真正需要集群共享的不是 TCP 连接本身,而是连接背后的状态——比如 WebSocket 的用户上下文、登录态、消息队列归属等。配置关键在于:让同一用户的请求始终落到同一后端节点(粘滞),同时确保该节点宕机时,状态能被其他节点接管(靠 Tomcat 复制或 Redis 存储)。
这是 Apache 层实现长连接路由一致性的基础:
proxy、proxy_http、proxy_balancer、proxy_connect
BalancerMember 必须带 route=xxx 参数,且值需与后端服务(如 Tomcat 的 jvmRoute 或 WebSocket 服务标识)严格一致普通 HTTP 负载均衡不能直接用于 WebSocket,必须走专用隧道模块:
mod_proxy_wstunnel(Apache 2.4.5+ 内置,检查 httpd -M | grep wstunnel)ProxyPass 指令必须使用 ws:// 或 wss:// 协议前缀,不能用 http://
ProxyPass /ws/ ws://127.0.0.1:8080/ws/,否则 Sec-WebSocket-Location 重写失败Timeout 3600 和 ProxyTimeout 3600,避免空闲连接被 Apache 主动断开Apache 不管理 session 数据,共享逻辑必须由后端实现:
web.xml 加 <distributable/>,server.xml 配 <Cluster>,并启用 BackupManager 或 DeltaManager
KeepAlive(设为 off 或极短时间),让前端负载均衡器(如 Nginx)负责连接复用,Apache 专注快速转发不要只看请求是否分发成功,要验证状态是否可延续:
jsessionid 是否携带 route 参数(如 node1)Sec-WebSocket-Accept 响应头是否稳定,且后端日志显示始终由同一实例处理