Apache需启用mod_proxy_wstunnel模块并正确配置ProxyPass、超时及头透传以代理WebSocket。必须加载mod_proxy、mod_proxy_http、mod_proxy_wstunnel;ProxyPass路径须用ws://或wss://;Timeout与ProxyTimeout均设为3600;强制透传Upgrade和Connection头。
apache 本身不处理聊天室的长连接逻辑,关键在于正确透传 websocket 协议、维持隧道、避免超时中断。它不负责心跳或消息分发,只做可靠通道代理。
必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 并建立隧道的模块。缺它,所有 WebSocket 请求都会被当作普通 HTTP 处理,握手后帧流直接丢失。
- 检查是否已加载:
httpd -M | grep wstunnel,输出需含proxy_wstunnel_module (shared) - 确保三者同时启用:
mod_proxy、mod_proxy_http、mod_proxy_wstunnel - 在
httpd.conf中确认这三行未被注释:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
ProxyPass 必须用 ws:// 或 wss:// 前缀
写成 http:// 就等于放弃 WebSocket,哪怕路径和后端一致,也会走 HTTP 代理流程,导致连接静默断开。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 正确写法(注意路径末尾
/严格一致):ProxyPass /chat/ ws://127.0.0.1:3000/chat/ProxyPassReverse /chat/ ws://127.0.0.1:3000/chat/ - 若前端是 HTTPS 站点,且希望 SSL 终止在 Apache,则 ProxyPass 仍用
ws://;如需端到端加密,前端用wss://,Apache 需配置有效证书并 ProxyPass 写wss:// - 规则顺序很重要:WebSocket 路径(如
/chat/)必须放在通用ProxyPass /规则之前,否则会被提前匹配拦截
超时设置必须同步延长至 3600 秒
默认 60 秒 Timeout 和 ProxyTimeout 是聊天室掉线的最常见原因——Apache 自己把空闲连接关了,不是后端问题。
- 在对应
<VirtualHost>块中添加:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置:前者控制请求生命周期,后者控制 socket 级连接存活,不一致会导致行为不可预测
- 不建议全局修改,仅针对启用 WebSocket 的站点单独覆盖,兼顾安全与稳定性
强制透传 Upgrade 和 Connection 头
这两个是 hop-by-hop 头,Apache 默认可能清洗,导致浏览器收不到 101 Switching Protocols 响应,握手失败。
- 添加以下两行配置:
RequestHeader set Upgrade "websocket"RequestHeader set Connection "upgrade" - 禁用可能干扰的模块,例如
mod_security对Upgrade头的拦截规则 - 确保没有设置
retry=0、timeout=等 mod_proxy_wstunnel 不支持的参数,否则配置校验失败

















