Apache mod_proxy_balancer 本身不主动断开长连接,频繁断开主因是上下游超时错位、disablereuse误启用或协议不一致;需确保后端connectionTimeout大于ProxySet keepalive_timeout,显式设disablereuse=off并配keepalive=on,避免ping探测干扰,抓包确认RST来源。
apache mod_proxy_balancer 本身不主动断开长连接,频繁断开通常是上下游配置错位、超时参数冲突或协议行为不一致导致的。核心在于理清“谁先关”和“怎么关”——不是 balancer 主动杀连接,而是它无法维持与后端的稳定会话。
检查后端连接空闲超时是否小于 Apache 的 keepalive_timeout
这是最常见原因。Apache 的 ProxySet keepalive_timeout 必须严格小于后端(如 Tomcat、Spring Boot)的 connectionTimeout,否则后端会先关闭空闲连接,Apache 收到 RST 后无法复用,表现为“刚建好就断”。
- Tomcat 的 server.xml 中 Connector 的 connectionTimeout 建议 ≥ 20000ms(20 秒)
- Apache 的 ProxySet 中 keepalive_timeout=5(单位秒),即空闲连接最多保留 5 秒
- 若后端设为 3000ms(3 秒),而 Apache 设为 10 秒,则 3 秒后连接已被后端关闭,Apache 再次复用时会报错或新建连接
确认 ProxySet disablereuse 是否被误启用
disablereuse=on 是默认值,它会让 Apache 在每次请求结束后强制关闭后端连接,彻底禁用复用 —— 这不是“断开频繁”,而是“根本没复用”。流式接口、SSE、WebSocket 等场景必须显式设为 off。
- 在
块中添加:ProxySet disablereuse=off - 同时配 keepalive=on,二者配合才生效
- 错误写法:只写 keepalive=on 却未改 disablereuse,连接仍会被立即关闭
验证健康检查与 lbmethod 是否引发隐式连接重置
某些负载均衡策略(如 bybusyness)和高频健康探测(ping)可能干扰长连接状态,尤其当探测请求与业务连接共用同一 TCP 连接池时。
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 避免在使用 keepalive 的节点上启用 ping 探测(除非明确需要且版本 ≥ 2.4.33)
- 若使用 lbmethod=bybusyness,weight=0 隔离节点时 busy 计数仍会更新,可能导致连接被误判为“过载”而提前释放
- 建议改用 lbmethod=byrequests 或 bytraffic,更适配长连接场景
抓包确认断开源头和时机
仅看日志容易误判。用 tcpdump 抓代理到后端的流量,重点关注 FIN/RST 包的发起方:
- 如果后端 IP 主动发 FIN → 检查后端自身超时、线程池耗尽、GC 停顿或 OOM
- 如果 Apache 所在机器发 RST → 检查 ProxyTimeout / timeout 参数是否过短,或 connectiontimeout 触发失败重试
- 连续请求间源端口不变但出现 RST → 是 keepalive 复用失败,而非新建连接问题









