apache需启用mod_proxy、mod_proxy_http、mod_proxy_wstunnel三模块,用ws://前缀proxypass透传websocket握手,设timeout与proxytimeout为相同大值,并保留upgrade/connection头。
apache 本身不处理 websocket 协议,配置目标不是让它“解析”协议,而是准确透传 upgrade 握手请求、建立隧道并维持长连接。关键靠 mod_proxy_wstunnel 模块实现,不是 mod_proxy_http。
必须启用三个核心模块
缺一不可,否则配置无效:
-
mod_proxy:代理基础框架,必须最先加载 -
mod_proxy_http:mod_proxy_wstunnel内部依赖它建立底层 TCP 连接,不是可选项 -
mod_proxy_wstunnel:唯一能识别Upgrade: websocket并触发隧道逻辑的模块
检查是否已启用:
Linux/macOS:httpd -M | grep -E "(proxy|wstunnel)"
Windows:httpd -M | findstr wstunnel
Debian/Ubuntu 可直接运行:sudo a2enmod proxy proxy_http proxy_wstunnel && sudo systemctl restart apache2
ProxyPass 必须用 ws:// 或 wss:// 前缀
这是触发 mod_proxy_wstunnel 的唯一开关。写成 http:// 看似能通,实则走 HTTP 代理流程,握手后帧传输必然异常。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 正确写法(路径末尾斜杠必须前后一致):
ProxyPass "/ws/" "ws://127.0.0.1:8080/ws/"ProxyPassReverse "/ws/" "ws://127.0.0.1:8080/ws/" - WebSocket 规则必须放在通用 HTTP 规则之前,避免被提前拦截
- 若前端是 HTTPS 站点且使用
wss://,Apache 需配置 SSL 证书;后端仍可用ws://(SSL 终止在 Apache),此时ProxyPass仍写ws://
超时参数必须同步调大
WebSocket 是长连接,Apache 默认 Timeout 和 ProxyTimeout 均为 60 秒,空闲即断,导致“静默掉线”。
- 在对应
<virtualhost></virtualhost>中显式设置:Timeout 3600ProxyTimeout 3600 - 两个值必须相等且同时设置——
ProxyTimeout控制 socket 级超时,Timeout影响整体请求生命周期,不一致会导致行为不可控 - 不建议全局修改,仅在 WebSocket 专用站点中覆盖
确保 Upgrade 和 Connection 头完整透传
这两个是 hop-by-hop 请求头,Apache 默认可能清洗,导致浏览器收不到 101 Switching Protocols 响应。
- 显式保留:
RequestHeader set Upgrade "websocket"RequestHeader set Connection "upgrade" - 禁用干扰行为:不要加
retry=0、timeout=等 HTTP 专用参数(mod_proxy_wstunnel不支持,加了会校验失败) - 负载均衡场景下,需用
stickysession=ROUTEID绑定客户端到同一后端节点,避免状态丢失










