Apache代理WebSocket频繁断开的主因是默认按HTTP处理、60秒空闲即断连,解决需启用mod_proxy_wstunnel模块,ProxyPass使用ws://前缀,同步设置Timeout与ProxyTimeout为3600,并透传Upgrade和Connection头。
apache 代理 websocket 连接频繁断开,核心原因不是网络不稳,而是 apache 默认把 websocket 当普通 http 处理,60 秒空闲就主动切断 tcp 连接。解决的关键是让它“认出”并“守住” websocket 隧道。
必须启用 mod_proxy_wstunnel 模块
这是 Apache 唯一能处理 WebSocket 协议升级的模块。缺它,所有 Upgrade 请求都会被降级转发,握手虽成功(返回 101),后续帧全丢。
- 检查是否已加载:
httpd -M | grep wstunnel或a2enmod proxy_wstunnel(Debian/Ubuntu) - 确认配置中三行已启用:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
ProxyPass 必须用 ws:// 或 wss:// 前缀
写成 http://backend:8080/ 就走 HTTP 代理流程;必须明确指向 WebSocket 后端,让 Apache 进入隧道模式。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 容器内常见写法:
ProxyPass /ws ws://app-backend:8080/ws - 搭配重写规则更稳妥(尤其路径需透传时):
RewriteCond %{HTTP:Upgrade} =websocket [NC]RewriteRule /(.*) ws://app-backend:8080/$1 [P,L]
Timeout 和 ProxyTimeout 必须同步设为 3600
默认值 60 秒是断连主因。两个参数必须同时设置且相等,否则任一环节先超时都会触发静默断连。
- 在对应
<VirtualHost>或站点配置块中添加:Timeout 3600ProxyTimeout 3600 - 若后端是 Spring Boot,还需同步调整:
server.tomcat.connection-timeout=3600000
确保 Upgrade 和 Connection 头完整透传
这两个是 hop-by-hop 头,Apache 默认可能清洗或改写,导致浏览器收不到合法的 101 响应。
- 显式保留(放在 ProxyPass 规则之前):
RequestHeader set Upgrade "websocket"RequestHeader set Connection "upgrade" - 禁用干扰模块(如 mod_security 对 Upgrade 头的拦截规则)
- 验证响应头:浏览器 Network → WS → Headers 中必须看到
Upgrade: websocket 和 Connection: upgrade

















