apache二进制安装默认不启用websocket代理,需手动加载mod_proxy、mod_proxy_http和mod_proxy_wstunnel三个模块,并配置ws://前缀的proxypass、透传upgrade/connection头、调大超时及禁用缓存干扰。

Apache 二进制安装(如官方 .tar.gz 包编译安装或 Windows/Linux 发行版预编译包)本身不自动启用 WebSocket 代理能力,必须手动加载模块并配置反向代理规则。它不“处理” WebSocket,而是通过 mod_proxy_wstunnel 模块透传 Upgrade 握手和后续帧——关键在正确启用、精准配置、避免干扰。
必须启用的三个核心模块
Apache WebSocket 代理依赖底层协作,缺一不可:
-
mod_proxy:代理基础框架,必须最先加载 -
mod_proxy_http:mod_proxy_wstunnel内部依赖它建立 TCP 连接,不是可选项 -
mod_proxy_wstunnel:唯一能识别Upgrade: websocket并切换为隧道模式的模块
确认方式(Linux):
httpd -M | grep -E "(proxy|wstunnel)"
应看到三者状态为 shared。若未启用,在 httpd.conf 中取消以下行注释:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
ProxyPass 必须用 ws:// 或 wss:// 前缀
这是触发 mod_proxy_wstunnel 的唯一开关。写成 http:// 看似能连,实则走普通 HTTP 代理流程,握手后数据帧会乱序或被丢弃。
示例(代理路径 /ws/ 到本地 8080):
ProxyPass "/ws/" "ws://127.0.0.1:8080/ws/" ProxyPassReverse "/ws/" "ws://127.0.0.1:8080/ws/"
⚠️ 注意顺序:WebSocket 规则必须放在通用 ProxyPass / 之前,否则会被提前匹配为 HTTP 请求。
调大超时参数,防止静默断连
默认 Timeout 和 ProxyTimeout 都是 60 秒,空闲即断,心跳失效。需同步设为足够大(建议 ≥ 3600):
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
Timeout 3600 ProxyTimeout 3600
这两个值必须相等——ProxyTimeout 控制 socket 层,Timeout 影响请求生命周期,不一致会导致行为异常。
强制透传关键请求头,禁用缓存干扰
Upgrade 和 Connection 是 hop-by-hop 头,默认可能被清洗:
RequestHeader set Upgrade "websocket" RequestHeader set Connection "upgrade" ProxyPreserveHost On
同时禁用可能干扰的设置:
- 不加
retry=0、timeout=等mod_proxy_http专用参数(mod_proxy_wstunnel不支持,会校验失败) - 不启用
mod_cache或mod_deflate对 WebSocket 路径生效 - 若启用了
mod_security,需放行Upgrade头,否则可能拦截握手
可选但推荐:优化长连接稳定性
<proxy>
ProxySet keepalive=On
ProxySet timeout=3600
</proxy>
keepalive=On 启用后端连接复用,减少重复握手开销;timeout 与 ProxyTimeout 保持一致更稳妥。
不复杂但容易忽略










