Nginx可通过map指令提取域名后缀并动态分发WebSocket请求:map必须定义在http块顶层,用~\.匹配字面量点号并转义域名中的点,按顺序匹配后缀(如com、org)映射到预定义upstream名称,proxy_pass引用$backend_cluster变量实现动态路由,需配合keepalive、proxy_http_version 1.1及Upgrade头确保WebSocket长连接正常。

可以通过 Nginx 的 map 指令提取域名后缀(如 .com、.org),再结合 upstream 和 proxy_pass 实现 WebSocket 请求按后缀分发到不同集群。
提取域名后缀并映射到上游组名
Nginx 本身不直接支持正则捕获后缀,但可用 map 配合变量和正则匹配实现。关键是用 $host 提取后缀,并映射为预定义的 upstream 名称:
map $host $backend_cluster {
~\.(com|example\.com)$ "ws_com_cluster";
~\.(org|example\.org)$ "ws_org_cluster";
~\.(cn|example\.cn)$ "ws_cn_cluster";
default "ws_default_cluster";
}说明:
- 正则以
~\.开头,确保匹配字面量点号;example\.com中的反斜杠用于转义点号 - 每个匹配值对应一个有意义的 upstream 名称(仅作标识,不自动创建 upstream)
- 顺序重要:更具体的规则(如
example.com)应放在更宽泛规则(如com)之前,避免被提前匹配
定义对应的 upstream 集群
为每个 map 中声明的名称定义实际的 WebSocket 后端集群,启用长连接与健康检查(可选):
upstream ws_com_cluster {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 32;
}
<p>upstream ws_org_cluster {
server 10.0.2.20:8080;
server 10.0.2.21:8080;
keepalive 32;
}</p><p>upstream ws_cn_cluster {
server 10.0.3.30:8080;
server 10.0.3.31:8080;
keepalive 32;
}</p><p>upstream ws_default_cluster {
server 10.0.99.1:8080;
}</p>注意:keepalive 是 WebSocket 复用连接的关键,需配合 proxy_http_version 1.1 和 Connection 头设置。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
在 server 块中完成 WebSocket 代理转发
在 location / 或具体路径下,使用 $backend_cluster 变量做动态 proxy_pass:
server {
listen 443 ssl;
server_name ~^(?<domain>.+)\.example\.com$;
<pre class="brush:php;toolbar:false;"># WebSocket 必备头
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 关键:动态 upstream
proxy_pass http://$backend_cluster;
# 超时调大,适应长连接
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
说明:
-
proxy_pass后不能加 URI 路径(如/ws),否则会丢弃原始路径;如需重写,用rewrite+break配合 -
proxy_read_timeout设为较大值(如 24 小时),防止 Nginx 主动断开空闲 WebSocket 连接 -
$http_upgrade和Connection: upgrade是触发 WebSocket 升级的关键头
验证与调试建议
上线前建议验证逻辑是否正确:
- 用
nginx -t检查语法,确认map和upstream定义无误 - 开启
error_log /var/log/nginx/debug.log debug;,查看$backend_cluster实际取值 - 用
curl -i -N -H "Upgrade: websocket" -H "Connection: Upgrade" https://test.com/ws测试握手响应是否为101 Switching Protocols - 检查后端服务日志,确认请求确实到达对应集群节点










