代理与网络
教程折腾20 分钟

Reality 主力 + WS 保底并行部署:一台 VPS 同时保留两条线路

把 Reality 直连和 WS+Cloudflare 保底并行部署在同一台 VPS。

Reality 主力 + WS 保底并行部署:一台 VPS 同时保留两条线路 封面图
更新于 2026年7月12日0 收藏0 认为有帮助系列第 5 / 5
验证版本
Xray v26.3.27
验证日期
2026-05-20 00:00
现在可看
15 个
剩余内容
当前页已完整
开始前
你会得到什么
  • 同一台 VPS 同时保留主力和备用线路
  • 用 server_name 在同一 8080 后端区分服务
  • 完成 Reality 与 WS 两个客户端节点验证
开始前要有
  • 已理解 Reality、SNI 分流和 WS+Cloudflare
  • 同一台 VPS 上规划好内部端口
  • Cloudflare 代理域名可用
关键工具
Xray-core · 26.3.27
Nginx stream
Reality
WebSocket
Cloudflare
行动入口

来源与后续讨论

这里不是普通友情链接,而是读完文章后最应该跳转确认的地方:官网确认版本,GitHub 看源码和 Issue,第三方来源做交叉参考,X 帖子看后续补充和讨论。

建议顺序:官网 → GitHub → 第三方来源 → X 讨论。遇到版本差异时,优先相信官网和仓库发布记录。
正文

Reality 主力 + WS 保底并行部署:一台 VPS 同时保留两条线路

前几篇分别讲了 Reality 直连、Nginx SNI 分流和 WS + Cloudflare。并行版把它们合在一起:Reality 作为日常主力线路,WebSocket + Cloudflare 作为备用线路。

这不是入门方案。建议先分别跑通 Reality 基础版Nginx SNI 分流WS + Cloudflare,再部署本文结构。

最终架构

输出text
: VPS:443  |  vNginx stream  |  |-- SNI=example.com     ->  HTTPS :127.0.0.1:8080  |-- SNI=www.example.com ->  HTTPS :127.0.0.1:8080  |-- SNI=ws.example.com  -> WS HTTPS :127.0.0.1:8080  |--  SNI            -> Xray Reality:127.0.0.1:10443 WS HTTPS :127.0.0.1:8080  |  vXray WS inbound:127.0.0.1:20443

客户端侧保留两个节点:

  • Reality 节点:连接 <SERVER_IP>:443
  • WS 节点:连接 ws.example.com:443,由 Cloudflare 代理。

端口规划

端口服务用途对外暴露
443Nginx stream统一公网入口
8080Nginx HTTPS 主站,WS 域名按 server_name 区分主站和 WS 后端否,仅本机
10443Xray RealityReality inbound否,仅本机
20443Xray WebSocketWS inbound否,仅本机

之前的教程里 WS 和 Reality 都曾使用 10443,合并到并行版时容易冲突。本文明确把 Reality 放在 10443,把 WS 放在 20443。

vless-reality-ws-cloudflare-parallel_并行部署总架构教学图

步骤一:Cloudflare DNS

在 Cloudflare 添加:

类型名称内容代理状态用途
A@<VPS_IP>按主站需要设置主域名
Awww<VPS_IP>按主站需要设置主站
Aws<VPS_IP>ProxiedWS 保底线路

Cloudflare SSL/TLS 推荐使用 Full (strict)。如果源站证书还没准备好,可以临时使用 Full,但发布前应该补齐有效证书并复测。

步骤二:生成 Xray 参数

命令bash
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install xray uuidxray x25519openssl rand -hex 8

记录:

占位符用途
<UUID>Reality 和 WS 可以共用,也可以分开生成
<PRIVATE_KEY>Reality 服务端私钥
<PUBLIC_KEY>Reality 客户端公钥
<SHORT_ID>Reality shortId

为了便于失效隔离,生产环境可以给 Reality 和 WS 使用不同 UUID。本文为了降低理解成本,示例中共用一个 <UUID>

步骤三:写入 Xray 双 inbound 配置

编辑:

命令bash
vim /usr/local/etc/xray/config.json

写入:

配置json
{  "log": {    "loglevel": "warning"  },  "inbounds": [    {      "tag": "reality-in",      "listen": "127.0.0.1",      "port": 10443,      "protocol": "vless",      "settings": {        "clients": [          {            "id": "<UUID>",            "flow": "xtls-rprx-vision"          }        ],        "decryption": "none"      },      "streamSettings": {        "network": "tcp",        "security": "reality",        "realitySettings": {          "show": false,          "dest": "www.microsoft.com:443",          "serverNames": ["www.microsoft.com", "microsoft.com"],          "privateKey": "<PRIVATE_KEY>",          "shortIds": ["<SHORT_ID>"]        }      },      "sniffing": {        "enabled": true,        "destOverride": ["http", "tls", "quic"],        "routeOnly": true      }    },    {      "tag": "ws-in",      "listen": "127.0.0.1",      "port": 20443,      "protocol": "vless",      "settings": {        "clients": [          {            "id": "<UUID>",            "flow": ""          }        ],        "decryption": "none"      },      "streamSettings": {        "network": "ws",        "security": "none",        "wsSettings": {          "path": "/gl2025ws"        }      },      "sniffing": {        "enabled": true,        "destOverride": ["http", "tls", "quic"],        "routeOnly": true      }    }  ],  "outbounds": [    {      "protocol": "freedom",      "tag": "direct"    },    {      "protocol": "blackhole",      "tag": "block"    }  ],  "routing": {    "domainStrategy": "IPIfNonMatch",    "rules": [      {        "type": "field",        "ip": ["geoip:private"],        "outboundTag": "block"      },      {        "type": "field",        "protocol": ["bittorrent"],        "outboundTag": "block"      }    ]  }}

检查并启动:

命令bash
xray -test -config /usr/local/etc/xray/config.jsonsystemctl daemon-reloadsystemctl enable --now xraysystemctl restart xrayss -tulnp | grep -E ':10443|:20443'

步骤四:配置主站 HTTPS 后端

主站和 WS 域名都可以监听 8080,由 Nginx 按 server_name 区分具体服务。主站 server 示例:

代码nginx
server {    listen 8080 ssl http2;    server_name example.com www.example.com;     ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;     root /var/www/example.com;    index index.html index.htm;}

如果你没有主站,可以省略主站映射,只保留 ws.example.com 和 default Reality 分支。

步骤五:配置 WS 域名 HTTPS 后端

创建:

命令bash
vim /etc/nginx/conf.d/ws.example.com.conf

写入:

代码nginx
server {    listen 8080 ssl http2;    server_name ws.example.com;     ssl_certificate /etc/letsencrypt/live/ws.example.com/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/ws.example.com/privkey.pem;     location /gl2025ws {        if ($http_upgrade != "websocket") {            return 404;        }         proxy_redirect off;        proxy_pass http://127.0.0.1:20443;        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;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }     location / {        return 404;    }}

注意这里反代到 20443,不是 Reality 使用的 10443

步骤六:配置 Nginx stream 统一入口

编辑:

命令bash
vim /etc/nginx/nginx.conf

在最外层加入:

代码nginx
stream {    map $ssl_preread_server_name $backend {        example.com      127.0.0.1:8080;        www.example.com  127.0.0.1:8080;        ws.example.com   127.0.0.1:8080;         default          127.0.0.1:10443;    }     server {        listen 443;        ssl_preread on;        proxy_pass $backend;        proxy_connect_timeout 10s;        proxy_timeout 300s;    }}

检查并重载:

命令bash
nginx -tsystemctl reload nginxss -tulnp | grep -E ':443|:8080|:10443|:20443'

步骤七:防火墙

只开放公网入口:

命令bash
ufw allow 22/tcpufw allow 443/tcpufw deny 8080/tcpufw deny 10443/tcpufw deny 20443/tcpufw enableufw status

云安全组同样只需要开放 22 和 443,除非主站还有 80 跳转需求。

步骤八:分支验证

验证 Xray 监听:

命令bash
systemctl is-active xrayss -tlnp | grep -E ':10443|:20443'

验证 Nginx:

命令bash
nginx -tsystemctl is-active nginxss -tlnp | grep ':443'

验证 WS 后端:

命令bash
curl -k -si https://127.0.0.1:8080/gl2025ws \  -H 'Connection: Upgrade' \  -H 'Upgrade: websocket' \  -H 'Host: ws.example.com' \  -H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' \  -H 'Sec-WebSocket-Version: 13' \  | grep -iE '^HTTP|upgrade'

验证主站:

命令bash
curl -Iv https://example.com

最后用客户端分别测试两个节点。不要只测其中一个,否则并行方案的备用价值无法确认。

客户端节点一:Reality 主力

参数
地址<SERVER_IP>
端口443
UUID<UUID>
Flowxtls-rprx-vision
传输tcp
TLSreality
SNIwww.microsoft.com
Fingerprintchrome
PublicKey<PUBLIC_KEY>
ShortId<SHORT_ID>

客户端节点二:WS 保底

参数
地址ws.example.com
端口443
UUID<UUID>
Flow留空
传输ws
路径/gl2025ws
TLStls
SNIws.example.com
Hostws.example.com

切换逻辑

输出text
使:Reality  -> VPS:443 -> Nginx stream default -> Xray:10443 :WS  -> Cloudflare -> VPS:443 -> Nginx stream ws.example.com -> Nginx:8080 -> Xray:20443

切换后要验证三件事:

  • 真连接延迟有返回。
  • 出口 IP 和 DNS 行为符合预期。
  • 常用网站、包管理器或工作流能稳定访问。
vless-reality-ws-cloudflare-parallel_双节点切换流程教学图

小结

并行版的关键是清晰分层:

  • Nginx stream 只负责 443 入口和 SNI 分流。
  • 主站、WS 反代、Reality inbound、WS inbound 使用不同本机端口。
  • Reality 是主力低延迟线路。
  • WS + Cloudflare 是备用线路和源站隐藏入口。
  • 两个客户端节点都必须定期验证,备用线路不能等故障时才第一次测试。

部署完成后,建议继续看 最终总结与故障切换清单,把端口、参数和验证命令整理成运维检查表。

0%
继续行动
阅读提示

按文章步骤复核自己的 VPS、域名、端口和客户端参数。

复制命令前先替换占位符并执行配置检查。现在可看 15 段,这页已经可以直接看完。属于系列 VLESS/Xray 自建代理实战 · 第 5 / 5 篇

这篇已经可以直接看完,可以继续下一篇。

相关阅读

按顺序继续补齐上下文

5
继续这个系列

VLESS/Xray 自建代理实战

当前第 5 / 5
更新记录
2026年5月25日
已完成验证