apache不处理websocket ping/pong帧,仅透传;后端必须显式响应,apache需启用mod_proxy_wstunnel、设proxy_read_timeout/proxy_send_timeout≥心跳间隔×3、强制透传upgrade/connection头并禁用缓存。

Apache 本身不直接解析或透传 WebSocket 协议层的 Ping/Pong 帧(Opcode 0x9 / 0xA),它只负责 TCP 连接代理和 HTTP Upgrade 协商。真正的 Ping/Pong 处理必须由后端 WebSocket 服务(如 Node.js、FastAPI、Spring Boot)完成,Apache 只需确保这些控制帧能**无损透传**——不拦截、不缓冲、不超时中断。配置核心是让 Apache 正确升级连接,并延长空闲超时。
必须启用 mod_proxy_wstunnel 模块
这是 Apache 官方推荐的 WebSocket 代理模块(替代已弃用的 mod_websocket),专为 WS/WSS 设计,支持原生 Upgrade 透传:
- 确认已加载:
a2enmod proxy_wstunnel(Debian/Ubuntu)或检查LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - 该模块会自动识别
Upgrade: websocket请求并切换为隧道模式,绕过常规 HTTP 处理链 - 无需额外配置 Ping/Pong 行为——只要连接未断,帧就会原样转发
关键 Proxy 配置:防止静默断连
默认 Apache 超时极短(通常 60 秒),会直接切断“无数据”的长连接,导致心跳失效。需在 <virtualhost></virtualhost> 或 Location 块中显式放宽:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- proxy_read_timeout 180 —— 必须 ≥ 心跳间隔 × 3(例如心跳 30 秒,则设为 90 或 180)
- proxy_send_timeout 180 —— 匹配 read_timeout,避免服务端发 Pong 稍慢被掐
- ProxySet keepalive=On —— 启用后端连接复用,减少握手开销
- 完整示例:
ProxyPass "ws://127.0.0.1:8080/ws"
ProxyPassReverse "ws://127.0.0.1:8080/ws"
ProxySet keepalive=On
ProxySet timeout=180
proxy_read_timeout 180
proxy_send_timeout 180
强制 Upgrade 头透传(防中间设备丢帧)
某些防火墙或云网关会过滤非标准头。Apache 必须原样转发客户端发起的 Upgrade 请求:
- ProxyPreserveHost On —— 保持原始 Host,避免后端路由错误
- RequestHeader set Connection "upgrade" —— 显式设置 Connection 头(部分旧版 Apache 需此行)
- RequestHeader set Upgrade "websocket" —— 确保 Upgrade 头不被覆盖
- 禁用缓存:
CacheDisable *和Header always set Cache-Control "no-store"
验证 Ping/Pong 是否真正透传
配置生效后,用抓包工具(如 Wireshark 或浏览器 DevTools 的 Network → WS Frames)确认:
- 客户端发送的
Ping (0x9)帧是否出现在后端日志或抓包中 - 后端返回的
Pong (0xA)帧是否能抵达浏览器(浏览器自动处理,不会触发 onmessage) - 若只看到应用层
{"type":"ping"}消息而无 0x9/0xA 帧,说明后端未启用协议层心跳,此时 Apache 配置正确但依赖应用层逻辑










