apache不处理websocket协议,需启用mod_proxy、mod_proxy_http、mod_proxy_wstunnel三模块;proxypass必须用ws://或wss://前缀;强制透传upgrade/connection头;timeout和proxytimeout须同步设为3600。
apache 本身不处理 websocket 协议升级,而是靠 mod_proxy_wstunnel 模块透传握手请求(upgrade: websocket 和 connection: upgrade)并维持隧道连接。配置关键不在“支持协议”,而在准确触发隧道、保留头、延长超时、避免清洗。
必须启用三个代理模块
缺一不可,否则 ProxyPass 写成 ws:// 也无效:
-
mod_proxy:代理基础框架 -
mod_proxy_http:mod_proxy_wstunnel的底层依赖(不是可选) -
mod_proxy_wstunnel:唯一能识别 WebSocket 升级并建立隧道的模块
检查命令:
Linux/macOS:httpd -M | grep -E "(proxy|wstunnel)"
Windows:httpd -M | findstr wstunnel
Debian/Ubuntu 可直接运行:sudo a2enmod proxy proxy_http proxy_wstunnel && sudo systemctl restart apache2
ProxyPass 必须用 ws:// 或 wss:// 前缀
这是触发 mod_proxy_wstunnel 的开关。写成 http:// 看似能连上,但握手后帧传输会失败,客户端报错 1006(ABNORMAL CLOSURE)。
正确示例(注意路径末尾 / 一致):
ProxyPass "/ws/" "ws://127.0.0.1:8080/ws/" ProxyPassReverse "/ws/" "ws://127.0.0.1:8080/ws/"
规则顺序很重要:WebSocket 路径(如 /ws/)必须放在通用代理规则(如 /)之前,否则被提前匹配走 HTTP 流程。
强制透传 Upgrade 和 Connection 头
这两个是 hop-by-hop 头,默认会被 Apache 清洗,导致后端收不到升级请求,无法返回 101 Switching Protocols。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
在对应 <virtualhost></virtualhost> 块中添加:
RequestHeader set Upgrade "websocket" RequestHeader set Connection "upgrade"
同时确认未启用干扰模块(如 mod_security 对 Upgrade 头的拦截),也不要在 ProxyPass 后加 retry=0 或 timeout= 等 HTTP 专用参数——mod_proxy_wstunnel 不支持。
同步调大 Timeout 和 ProxyTimeout
WebSocket 是长连接,Apache 默认均为 60 秒,空闲即断,造成“静默掉线”。
必须在同一个 <virtualhost></virtualhost> 中显式设置:
Timeout 3600 ProxyTimeout 3600
两个值必须相等且同时存在:
– Timeout 控制整个请求生命周期
– ProxyTimeout 控制 socket 级连接超时
不建议全局修改,只针对 WebSocket 专用站点覆盖即可。










