1005 字
5 分钟
Nginx 反向代理配置多节点教程 (VMess + WebSocket)

⚠️ 免责声明 VMess 是一种加密通信协议,常用于企业内网传输数据以提高安全性。本教程仅用于学习网络加密原理与 Nginx 反向代理技术,请勿用于连接任何非法网络或违反当地法律法规。

想要在同一台服务器上通过 Nginx 复用 443 端口来创建多个 VMess + WebSocket (WS) 节点,我们需要利用 Nginx 的 路径分流 功能。

核心原理#

  • 外部访问:所有流量通过 HTTPS (443端口) 访问同一个域名。
  • 分流规则:Nginx 根据访问路径(例如 /us1/uk1)将流量转发到服务器内部不同的 x-ui 端口。
  • 内部处理:x-ui 在后台监听不同的端口(例如 21000, 21001),接收来自 Nginx 的解密流量。

第一步:x-ui 面板配置#

在 x-ui 面板中,我们需要为每个“节点”创建一个独立的入站规则。

假设我们要创建两个节点,分别命名为 🇺🇸 US-1🇬🇧 UK-1

节点 A (US-1) 设置:#

  • 协议:VMess
  • 监听 IP127.0.0.1 (仅允许本地 Nginx 访问,更安全)
  • 端口21000 (这是内部端口,不要与 443 冲突)
  • 传输协议:ws (WebSocket)
  • 路径 (Path)/us1 (必须与 Nginx 配置一致)
  • UUID:系统自动生成

节点 B (UK-1) 设置:#

  • 协议:VMess
  • 监听 IP127.0.0.1
  • 端口21001
  • 传输协议:ws (WebSocket)
  • 路径 (Path)/uk1
  • UUID:系统自动生成(与节点 A 不同)

第二步:Nginx 配置 (核心步骤)#

我们需要修改 Nginx 的站点配置文件。在 server 块中,为每个节点添加对应的 location 块来处理 WebSocket 流量。

以下是优化后的 Nginx 完整配置示例:

server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 将你的域名填在这里
server_name yourdomain.com;
root /www/wwwroot/yourdomain.com;
index index.php index.html index.htm;
# ----------------------------------------------------
# SSL 证书配置 (请替换为你的证书路径)
# ----------------------------------------------------
ssl_certificate /www/server/panel/vhost/cert/[yourdomain.com/fullchain.pem](https://yourdomain.com/fullchain.pem);
ssl_certificate_key /www/server/panel/vhost/cert/[yourdomain.com/privkey.pem](https://yourdomain.com/privkey.pem);
# 优化 SSL 安全性
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AES128:EECDH+AES256:EECDH+CHACHA20:RSA+AES128:RSA+AES256:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
# 强制 HTTP 跳转 HTTPS
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
# 处理 HTTPS 错误重定向
error_page 497 https://$host$request_uri;
# ----------------------------------------------------
# 节点反代配置区域
# ----------------------------------------------------
# 节点 1:US-1 (对应 x-ui 端口 21000)
location /us1 {
if ($http_upgrade != "websocket") {
return 404; # 非 WS 流量直接返回 404,防止探测
}
proxy_pass [http://127.0.0.1:21000](http://127.0.0.1:21000);
proxy_redirect off;
# WebSocket 必须的头部设置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# 增加 Real-IP 传递(可选)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置,防止 WS 连接意外断开
proxy_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
# 节点 2:UK-1 (对应 x-ui 端口 21001)
location /uk1 {
if ($http_upgrade != "websocket") {
return 404;
}
proxy_pass [http://127.0.0.1:21001](http://127.0.0.1:21001);
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
# ----------------------------------------------------
# 网站默认配置 (PHP/静态资源/伪静态)
# ----------------------------------------------------
# PHP 引用 (根据实际情况调整版本)
include enable-php-83.conf;
# 伪静态规则
include /www/server/panel/vhost/rewrite/yourdomain.com.conf;
# 禁止访问敏感文件
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404;
}
# 静态资源缓存配置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$ {
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
# 日志路径
access_log /www/wwwlogs/yourdomain.com.log;
error_log /www/wwwlogs/yourdomain.com.error.log;
}

第三步:客户端连接设置#

在 Clash 或其他客户端添加节点时,请遵循以下规则:

  1. 地址 (Address/Host):填写绑定的域名(例如 yourdomain.com)。
  2. 端口 (Port):填写 Nginx 的 SSL 端口,通常是 443
  3. 用户 ID (UUID):填写 x-ui 面板中对应节点的 UUID。
  4. 传输协议 (Network):选择 ws (WebSocket)。
  5. 伪装/路径 (Path)
  • 连接节点 A 时填:/us1
  • 连接节点 B 时填:/uk1
  1. TLS/SSL:开启 (True)。

总结与检查清单#

配置完成后,请检查以下三点以确保连通性:

  1. 端口一致性:Nginx proxy_pass 的端口(如 21000)必须与 x-ui 面板中设置的端口一致。
  2. 路径一致性:Nginx location 的路径(如 /us1)必须与 x-ui 面板中的路径设置一致。
  3. 防火墙放行:服务器防火墙只需要放行 80443 端口。x-ui 的内部端口(21000, 21001)不需要对外开放,因为是通过本地回环地址(127.0.0.1)转发的。
Nginx 反向代理配置多节点教程 (VMess + WebSocket)
https://blog.obve.cn/posts/76542/
作者
Alec
发布于
2026-01-05
许可协议
CC BY-NC-SA 4.0