apache需启用mod_proxy、mod_proxy_http和mod_proxy_wstunnel三模块,proxypass必须用ws://或wss://前缀,路径末尾斜杠须一致,timeout与proxytimeout需同步设为相同长值,并透传upgrade和connection头以确保websocket隧道稳定建立。

必须启用三个核心模块
缺一不可,否则 ProxyPass 写成 ws:// 也无效:
- mod_proxy:代理基础框架
- mod_proxy_http:被 wstunnel 内部调用,用于建连(不是可选)
-
mod_proxy_wstunnel:唯一能识别
Upgrade: websocket并切换为隧道模式的模块
Debian/Ubuntu 下执行:a2enmod proxy proxy_http proxy_wstunnel && systemctl restart apache2
或检查是否加载:httpd -M | grep -E "(proxy|wstunnel)" —— 输出中应含 proxy_wstunnel_module
ProxyPass 必须用 ws:// 或 wss:// 前缀
这是触发隧道逻辑的唯一开关。写成 http:// 会走普通 HTTP 代理链,导致后续帧异常或静默断连:
- 正确示例:
ProxyPass /ws/ ws://127.0.0.1:8080/ws/ - 路径末尾
/必须前后一致,否则Sec-WebSocket-Location头重写失败,浏览器拒绝连接 - 若前端是 HTTPS,且希望 Apache 终止 SSL,则后端仍用
ws://;若需端到端加密,后端用wss://,Apache 需配 SSL 证书
超时参数必须同步放宽
默认 60 秒超时会直接 kill 空闲连接,是长连接中断最常见原因。两个值必须同时设、且相等:
-
Timeout 3600:影响整体请求生命周期 -
ProxyTimeout 3600:控制代理 socket 级空闲超时 - 不建议全局修改,仅在 WebSocket 对应的
<virtualhost></virtualhost>或<location></location>中覆盖
确保 Upgrade 和 Connection 头透传
这两个是 hop-by-hop 头,Apache 默认可能清洗或丢弃:
-
ProxyPreserveHost On:保持原始 Host,避免后端路由错乱 -
RequestHeader set Connection "upgrade"(部分旧版 Apache 需显式设置) RequestHeader set Upgrade "websocket"- 禁用缓存:
SetEnv nokeepalive 1不推荐;更稳妥的是确保后端主动响应 Ping/Pong,Apache 不做任何 body 缓存











