apache代理websocket的核心是透传而非处理,需启用mod_proxy、mod_proxy_http和mod_proxy_wstunnel三模块,proxypass必须用ws://或wss://前缀,强制透传upgrade/connection头,并设timeout与proxytimeout均为3600。

Linux 中用 Apache 代理 WebSocket 流量,核心不是“处理”协议,而是透传连接——靠 mod_proxy_wstunnel 模块把浏览器的 Upgrade 握手和后续帧原样转发给后端服务。配置对了,WebSocket 就能长连不断;错一个环节,就会 400、静默断开或握手失败。
确认并启用必需模块
Apache 二进制安装(如官方 tar.gz 或系统包)默认不启用 WebSocket 代理能力,必须手动加载三个模块:
-
mod_proxy:代理基础框架,必须最先加载 -
mod_proxy_http:mod_proxy_wstunnel内部依赖它建立 TCP 连接,不是可选项 -
mod_proxy_wstunnel:唯一能识别Upgrade: websocket并切换为隧道模式的模块
检查是否已启用:
httpd -M | grep -E "(proxy|wstunnel)"
应看到三者状态为 shared。若未启用,在 /etc/httpd/conf/httpd.conf(CentOS/RHEL)或 /etc/apache2/apache2.conf(Debian/Ubuntu)中取消以下行注释:
LoadModule proxy_module modules/mod_proxy.so<br>LoadModule proxy_http_module modules/mod_proxy_http.so<br>LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
Debian/Ubuntu 用户可直接运行:
sudo a2enmod proxy proxy_http proxy_wstunnel<br>sudo systemctl restart apache2
配置 ProxyPass 使用 ws:// 或 wss:// 前缀
这是触发隧道模式的唯一开关。写成 http:// 看似能通,实则走普通 HTTP 代理流程,握手后数据帧会被丢弃或乱序。
示例(将 /ws/ 路径代理到本地 8080 端口的 WebSocket 服务):
ProxyPass "/ws/" "ws://127.0.0.1:8080/ws/"<br>ProxyPassReverse "/ws/" "ws://127.0.0.1:8080/ws/"
注意:
- 路径末尾斜杠必须一致(
/ws/↔/ws/),否则可能 404 - 规则必须放在通用代理规则(如
ProxyPass / http://...)之前,否则被提前匹配为普通 HTTP 请求 - 若前端用
wss://,Apache 需配置 SSL 证书,并在<virtualhost></virtualhost>块中写wss://目标地址
透传 Upgrade 和 Connection 头
这两个是 hop-by-hop 头,Apache 默认可能清洗,导致后端收不到 101 Switching Protocols 响应。
在对应 <virtualhost></virtualhost> 或 <location></location> 块中添加:
RequestHeader set Connection "upgrade"<br>RequestHeader set Upgrade "websocket"
同时确保没有其他模块(如 mod_security)拦截或修改这些头字段。
调大超时并禁用缓存干扰
默认 Timeout 和 ProxyTimeout 都是 60 秒,空闲连接会被主动关闭,造成“静默掉线”。
在 WebSocket 专用站点的 <virtualhost></virtualhost> 块中设置:
Timeout 3600<br>ProxyTimeout 3600
两个值必须相等且同时设置:前者控制整个请求生命周期,后者控制 socket 级超时。
额外建议:
- 禁用响应缓存干扰:
ProxyPass /ws/ ... disablereuse=off(某些版本需加此参数避免连接复用问题) - 开启
ProxyPreserveHost On,让后端能正确识别原始 Host 请求头 - 避免在
<location></location>中重复定义或覆盖关键头字段
不复杂但容易忽略。只要模块启对、前缀写对、头透对、超时设对,WebSocket 就能稳稳跑在 Apache 后面。











