Apache不提供多端口统一映射,而是通过单端口(如443)按路径路由WebSocket请求;必须启用mod_proxy、mod_proxy_http和mod_proxy_wstunnel模块,并配置ProxyPass、Timeout、ProxyTimeout及RequestHeader等关键参数,确保隧道稳定。
apache 本身不提供“多端口统一映射入口”这种抽象能力,它不合并端口,也不自动路由不同端口到同一逻辑路径。所谓“多端口统一入口”,实际是通过 单个监听端口(如 80/443)接收请求,再按路径 + 协议识别,将 websocket 流量精准分发到后端多个 ws:// 地址 —— 这才是可落地、生产可用的做法。
必须启用的核心模块
缺一不可,否则 WebSocket 代理会静默失败或返回 500/1006 错误:
- mod_proxy:代理基础框架
- mod_proxy_http:mod_proxy_wstunnel 的底层依赖(不是可选)
- mod_proxy_wstunnel:唯一能处理 Upgrade: websocket 握手并维持隧道的模块
用路径区分后端,实现逻辑统一入口
不能靠端口统一,而要靠 URL 路径做路由分发。例如你有三个 WebSocket 服务分别运行在:
- ws://localhost:8081/chat
- ws://localhost:8082/notify
- ws://localhost:8083/live
在 Apache 的 <VirtualHost *:443> 中配置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ProxyPass /ws/chat/ ws://localhost:8081/chat/ProxyPass /ws/notify/ ws://localhost:8082/notify/ProxyPass /ws/live/ ws://localhost:8083/live/- 所有
ProxyPassReverse必须严格配对,末尾斜杠一致
关键参数一个都不能少
否则连接会在空闲 60 秒后被 Apache 主动断开(1006 ABNORMAL):
-
Timeout 3600和ProxyTimeout 3600—— 两个值必须相等且同时设置 RequestHeader set Connection "upgrade"RequestHeader set Upgrade "websocket"-
ProxyPreserveHost On—— 确保后端收到原始 Host,避免鉴权或 CORS 问题
前端调用保持路径一致
客户端 JavaScript 不需要知道后端真实端口,只连统一域名:
new WebSocket("wss://example.com/ws/chat/")new WebSocket("wss://example.com/ws/notify/")- 路径前缀
/ws/是你在 Apache 中定义的入口“逻辑根”,和后端端口完全解耦

















