Apache代理WebSocket长连接的关键在于:必须启用mod_proxy_wstunnel模块,ProxyPass使用ws://或wss://前缀,路径末尾斜杠严格一致,同步设置Timeout和ProxyTimeout为3600,并透传Upgrade/Connection头。

Apache 里配 ProxyPass 实现长连接,关键不是“打开某个开关”,而是选对协议、设对超时、路径对齐、模块到位——漏掉任一环,连接看着通,实际几秒就断。
WebSocket 长连接必须用 ws:// 或 wss://
ProxyPass 若写成 http://,哪怕后端是 WebSocket 服务,Apache 也会走 HTTP 代理流程,握手后帧流被截断或静默丢弃。浏览器可能连上又断开,无报错但不可用。
- 明文 WebSocket:用
ws://前缀,例如:ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 加密 WebSocket(WSS):前端必须 HTTPS,Apache 自己要配 SSL 证书,不能只靠后端提供;目标写
wss:// - 路径末尾斜杠必须严格一致:前后都带
/,否则Sec-WebSocket-Location头重写错误,现代浏览器直接拒绝连接
必须启用 mod_proxy_wstunnel 模块
mod_proxy_http 无法识别 WebSocket Upgrade 握手,只有 mod_proxy_wstunnel 能建立隧道并透传二进制帧。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 检查是否已加载:
httpd -M | grep proxy_wstunnel,输出应含proxy_wstunnel_module - 若未启用,在配置中添加:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 同时确保
mod_proxy和mod_proxy_http已启用(wstunnel 内部依赖它们)
超时时间必须同步调大
默认 60 秒的 Timeout 和 ProxyTimeout 会让空闲 WebSocket 连接被 Apache 主动关闭,后端无感知,客户端只看到“连接已关闭”。
- 在虚拟主机或全局配置中显式设置:
Timeout 3600ProxyTimeout 3600 - 两个值必须同时设且相等——
Timeout控制整个请求生命周期,ProxyTimeout控制代理连接的 socket 级空闲超时 - 禁用缓存干扰:
ProxyRequests Off,并在对应 Location 中加:Header always set Connection "upgrade"Header always set Upgrade "websocket"
普通 HTTP 长连接(如 Tomcat 后端)要复用 TCP
如果代理的是 Java 应用(如 Spring Boot/Tomcat),想复用 Apache 到后端的连接以降低建连开销,需开启 keepalive:
- ProxyPass 指令中加参数:
ProxyPass /api http://127.0.0.1:8080/api keepalive=on - 配合 ProxySet 控制连接池:
ProxySet keepalive_timeout=5 max=50 acquire=3000
其中keepalive_timeout应 ≤ 后端的 connectionTimeout(如 Tomcat 的 20000ms) - 后端需支持 HTTP/1.1 持久连接(Tomcat 默认开启),建议用 NIO 连接器,避免 BIO 模式下线程耗尽

















