apache本身不处理websocket协议,关键在于启用mod_proxy_wstunnel模块、proxypass使用ws://或wss://前缀、同步设置timeout和proxytimeout为3600、强制透传upgrade/connection头,并确保规则顺序正确。

必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 并建立隧道的模块。缺它,Apache 就当普通 HTTP 请求处理,握手后帧全丢。
- 检查是否加载:
httpd -M | grep proxy_wstunnel(Linux/macOS)或httpd -M | findstr wstunnel(Windows) - 未启用需在
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 - Debian/Ubuntu 可直接运行:
sudo a2enmod proxy proxy_http proxy_wstunnel
ProxyPass 必须用 ws:// 或 wss:// 前缀
ServerName 写对了,但若 ProxyPass 写成 http://,连接照样断——因为走的是 HTTP 代理流程,不是隧道。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确写法(路径末尾斜杠必须一致):
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - WebSocket 规则要放在通用规则(如
ProxyPass / http://...)之前,否则被提前拦截 - 前端用
wss://,Apache 就得配 SSL 证书;后端可用ws://(SSL 终止在 Apache)
Timeout 和 ProxyTimeout 必须同步设为 3600
默认 60 秒超时会主动 kill 空闲连接,导致“静默掉线”。这不是后端问题,是 Apache 自己断的。
- 在对应
<virtualhost></virtualhost>块中添加:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置:前者影响整体请求生命周期,后者控制 socket 级超时
- 不建议全局修改,只在 WebSocket 专用站点中覆盖
确保 Upgrade 和 Connection 头透传
这两个是 hop-by-hop 头,Apache 默认可能清洗,导致浏览器收不到 101 Switching Protocols 响应。
- 显式保留:
RequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket" - 禁用可能干扰的模块(如 mod_security 对 Upgrade 头的拦截)
- 避免在
<location></location>块中加冗余ProxySet,易引发复用异常










