apache本身不解析websocket协议,只透传upgrade握手和帧;稳定长连需启用mod_proxy_wstunnel模块、proxypass用ws://或wss://前缀、同步设timeout与proxytimeout为3600、强制透传upgrade/connection头。

Apache 本身不解析 WebSocket 协议,它只负责把 Upgrade 握手和后续帧原样透传给后端服务。能否稳定长连,取决于模块启用、代理规则写法、超时设置和请求头控制这四个关键点。
必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 并建立隧道的模块。仅启用 mod_proxy 和 mod_proxy_http 不够,连接会在握手后中断(典型错误:1006 ABNORMAL)。
- 检查是否已加载:
httpd -M | grep proxy_wstunnel(Linux/macOS)或httpd -M | findstr wstunnel(Windows),输出应含proxy_wstunnel_module (shared) - 未启用需确认
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:// 前缀
协议前缀决定 Apache 走哪条代理路径。写成 http:// 就走普通 HTTP 代理流程,WebSocket 帧会被丢弃。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确示例(路径末尾斜杠必须一致):
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 若前端用
wss://,Apache 必须配置 SSL 证书(HTTPS 终止在 Apache),后端仍可用ws:// - WebSocket 规则要放在通用规则(如
ProxyPass / http://...)之前,否则被提前匹配并拦截
强制透传 Upgrade 和 Connection 头
这两个是 hop-by-hop 头,Apache 默认可能清洗,导致浏览器收不到 101 Switching Protocols 响应,握手失败。
- 在对应
<virtualhost></virtualhost>块中添加:RequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket" - 禁用可能干扰的模块(如
mod_security对Upgrade头的拦截) - 避免在
<location></location>块中重复设置,容易引发冲突
Timeout 和 ProxyTimeout 必须同步设为 3600
默认 60 秒超时会主动 kill 空闲连接,造成“静默掉线”。这不是后端问题,是 Apache 自己断开的。
- 在 WebSocket 专用的
<virtualhost></virtualhost>块中添加:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置:前者影响整体请求生命周期,后者控制 socket 级超时
- 不建议全局修改,只在需要长连接的站点中覆盖
不复杂但容易忽略。










