Apache不处理WebSocket连接,仅透传Upgrade请求;需启用mod_proxy_wstunnel模块,ProxyPass必须用ws://或wss://前缀,统一路径末尾斜杠,配置Timeout和ProxyTimeout为3600,并配合客户端心跳实现保活。

Apache本身不处理WebSocket连接,只负责把Upgrade请求正确透传给后端。保活的关键不在Apache“维持连接”,而在于它不主动切断、不干扰、不误判——让长连接真正由后端和客户端自主维持。
启用并确认mod_proxy_wstunnel模块
这是整个配置的前提。Apache 2.4.5+才内置该模块,低于此版本无法支持WebSocket代理。
- 运行httpd -M | grep proxy,检查输出中是否含proxy_wstunnel_module
- 若缺失,编辑httpd.conf或mods-enabled/proxy_wstunnel.load,添加:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 确保mod_proxy和mod_proxy_http也已加载(wstunnel依赖它们)
- 重启前务必执行apachectl configtest,避免因模块缺失导致启动失败且错误日志模糊
ProxyPass必须用ws://或wss://协议前缀
这是最容易出错的一步。写成http://会让Apache走HTTP代理逻辑,握手虽成功,后续帧传输会异常(如ping无响应、静默断开)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确写法(路径末尾/必须一致):
ProxyPass /ws/ ws://127.0.0.1:8080/ws/
ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 若后端是WSS(加密WebSocket),前端也必须是HTTPS站点,否则浏览器直接阻止;此时ProxyPass仍写wss://,但Apache自身需配置SSL证书
- 不要加retry=0等HTTP代理参数——mod_proxy_wstunnel不支持,加了会导致配置校验失败
延长超时设置,防止空闲断连
Apache默认Timeout和ProxyTimeout均为60秒。WebSocket长连接一旦空闲超时,Apache会主动断开socket,而后端和客户端都感知不到,表现为“突然掉线”。
- 在WebSocket专用的<VirtualHost>内显式覆盖:
Timeout 3600
ProxyTimeout 3600 - 注意:Timeout影响整个vhost的请求等待,设太高有DoS风险,不建议全局修改;ProxyTimeout虽名义上只对mod_proxy生效,但mod_proxy_wstunnel实际依赖底层socket超时,两个值必须同时调大
配合客户端心跳,实现端到端保活
Apache不做心跳,但它的配置必须为心跳留出空间。真正的保活靠客户端定时发ping、服务端回pong,中间件(包括Apache)只负责不干扰这个过程。
- 客户端心跳间隔建议设为45–60秒,确保小于Apache的ProxyTimeout(如3600秒)和NAT/防火墙超时(通常120–300秒)
- 服务端收到ping后应立即回复pong,并记录最后心跳时间;可启动后台任务,对超时(如90秒未收ping)的连接主动close,避免僵尸连接堆积
- Apache无需额外配置心跳相关指令(如ProxySet upgrade=websocket是冗余的,wstunnel模块自动识别Upgrade头)

















