Apache实现WebSocket代理的关键是启用mod_proxy_wstunnel模块、ProxyPass使用ws://或wss://前缀、强制透传Upgrade/Connection头、同步设置Timeout和ProxyTimeout为3600。
apache 本身不处理 websocket 协议逻辑,实现双向实时通信代理的关键是用 mod_proxy_wstunnel 模块建立隧道,而不是“转发”数据。它只负责在客户端和后端 websocket 服务之间透传原始字节流,握手成功后完全交由两端直接通信。配置核心就四件事:启用模块、写对协议前缀、保头、调超时。
必须启用 mod_proxy_wstunnel 模块
这是唯一能识别 Upgrade: websocket 请求并切换为隧道模式的模块。缺它,Apache 会把整个连接当普通 HTTP 处理,握手后所有帧都被静默丢弃。
- 检查是否已加载:
httpd -M | grep proxy_wstunnel(Linux/macOS)或httpd -M | findstr wstunnel(Windows),应看到proxy_wstunnel_module (shared) - 若未启用,在
httpd.conf中取消以下三行注释(路径可能因安装方式略有不同):LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so - Debian/Ubuntu 用户可直接运行:
sudo a2enmod proxy proxy_http proxy_wstunnel
ProxyPass 必须用 ws:// 或 wss:// 前缀
只有目标地址以 ws:// 或 wss:// 开头,mod_proxy_wstunnel 才会激活隧道逻辑。写成 http:// 看似能完成握手,但后续帧无法通过 HTTP 代理通道传输,连接立即中断。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 明文示例(前端访问
/ws/,后端监听127.0.0.1:8080/ws/):ProxyPass /ws/ ws://127.0.0.1:8080/ws/ProxyPassReverse /ws/ ws://127.0.0.1:8080/ws/ - 加密示例(Apache 终结 HTTPS):
ProxyPass /ws/ wss://127.0.0.1:8443/ws/ProxyPassReverse /ws/ wss://127.0.0.1:8443/ws/ - 路径末尾斜杠必须严格一致:前后都带
/,否则Sec-WebSocket-Location重写错误,现代浏览器直接拒绝连接
强制透传 Upgrade 和 Connection 头
WebSocket 握手依赖这两个 hop-by-hop 请求头,Apache 默认可能清洗或修改它们,导致后端收不到升级信号,无法返回 101 Switching Protocols。
- 在同一个
<VirtualHost>块内添加:ProxyPreserveHost OnRequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket" - 确保
mod_headers已启用(检查httpd -M | grep headers) - 禁用可能干扰的模块,如
mod_deflate(WebSocket 帧不可压缩,压缩会破坏二进制流)或mod_security(某些规则会拦截Upgrade头)
同步设置 Timeout 和 ProxyTimeout 为 3600
WebSocket 是长连接,Apache 默认 60 秒超时会主动关闭空闲 socket,造成“静默掉线”。这不是后端断开,是 Apache 自己 kill 的。
- 在对应
<VirtualHost>块中添加:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置:前者控制整体请求生命周期,后者控制代理层 socket 超时
- 建议只在 WebSocket 专用站点中覆盖,避免影响其他 HTTP 接口
- 该值需与后端服务(如 Spring Boot 的
server.tomcat.connection-timeout或 Node.js 的server.keepAliveTimeout)对齐,任一环节先断都会导致连接重置

















