apache不提供websocket重试机制,其核心职责是透传握手与帧、启用mod_proxy_wstunnel、同步设置timeout/proxytimeout为3600秒、透传upgrade/connection头,确保客户端能稳定重连。
apache 本身不提供 websocket 连接的“重试机制”——它不主动重连、不管理客户端断线后的恢复逻辑。重试是客户端(浏览器或前端应用)的责任,apache 的角色是**确保每次握手和后续帧都能稳定透传**,避免因自身配置缺陷导致连接频繁中断。真正影响重连成功率的,是 apache 是否让连接“活下来”,而不是“重起来”。
必须启用 mod_proxy_wstunnel 并正确触发隧道
这是所有稳定性的前提。如果模块未启用或 ProxyPass 写成 http://,Apache 就不会走 WebSocket 隧道流程,而是用普通 HTTP 代理转发,握手后帧传输必然失败,客户端感知为“连接立即断开”,重试再多次也无济于事。
- 确认三模块已加载:
proxy_module、proxy_http_module、proxy_wstunnel_module - ProxyPass 必须使用 ws:// 或 wss:// 前缀,例如:
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ - 路径末尾 / 必须严格一致,否则
Sec-WebSocket-Location头重写错误,浏览器拒绝连接
超时设置必须同步延长至 3600 秒
默认 60 秒 Timeout 和 ProxyTimeout 是 WebSocket 断连最常见原因。空闲连接会被 Apache 主动关闭,客户端收到 1006 错误,触发重连——但刚连上又断,形成“重连风暴”。这不是网络问题,是 Apache 自己切断的。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在对应
<virtualhost></virtualhost>块中添加:Timeout 3600和ProxyTimeout 3600 - 两个值必须相等且同时存在:前者控制请求生命周期,后者控制 socket 级连接存活
- 不要全局修改,只针对 WebSocket 专用站点配置,避免安全风险
头信息必须透传,不能被清洗或拦截
WebSocket 握手依赖 Upgrade: websocket 和 Connection: upgrade 这两个 hop-by-hop 头。Apache 默认可能丢弃它们,导致后端收不到升级请求,返回 200 而非 101,客户端连接直接失败。
- 显式保留关键头:
RequestHeader set Upgrade "websocket"和RequestHeader set Connection "upgrade" - 检查是否启用了干扰模块(如 mod_security),某些规则会拦截含
Upgrade的请求 - 禁用
retry=0、timeout=等 mod_proxy_http 专用参数,mod_proxy_wstunnel 不支持,加了会导致校验失败
客户端需实现指数退避重连(Apache 不做,但必须兼容)
Apache 不生成重试逻辑,但它必须允许客户端重连成功。只要上述三点配置正确,客户端就能稳定重建连接。推荐前端采用指数退避策略:
- 首次断开后延迟 1 秒重试
- 失败则依次延迟 2s → 4s → 8s … 最大不超过 30 秒
- 成功连接后重置计时器,避免持续长间隔等待
- 监听
onclose事件(特别是状态码 1006),而非仅靠onerror,更准确判断是否需重连










