Reality 主力 + WS 保底并行部署:一台 VPS 同时保留两条线路
把 Reality 直连和 WS+Cloudflare 保底并行部署在同一台 VPS。

- 同一台 VPS 同时保留主力和备用线路
- 用 server_name 在同一 8080 后端区分服务
- 完成 Reality 与 WS 两个客户端节点验证
- 已理解 Reality、SNI 分流和 WS+Cloudflare
- 同一台 VPS 上规划好内部端口
- Cloudflare 代理域名可用
来源与后续讨论
这里不是普通友情链接,而是读完文章后最应该跳转确认的地方:官网确认版本,GitHub 看源码和 Issue,第三方来源做交叉参考,X 帖子看后续补充和讨论。
Cloudflare Full 和 Full (strict) 模式说明
Xray 官方核心项目
Xray 官方安装脚本;作为补充来源保留,不占用 GitHub 主链接槽位。
Nginx 官方文档;Cloudflare 文档已作为主官方链接,本链接作为补充来源保留。
查看文章发布后的补充、读者反馈和最新讨论。
Reality 主力 + WS 保底并行部署:一台 VPS 同时保留两条线路
前几篇分别讲了 Reality 直连、Nginx SNI 分流和 WS + Cloudflare。并行版把它们合在一起:Reality 作为日常主力线路,WebSocket + Cloudflare 作为备用线路。
这不是入门方案。建议先分别跑通 Reality 基础版、Nginx SNI 分流 和 WS + Cloudflare,再部署本文结构。
最终架构
公网入口: 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 代理。
端口规划
| 端口 | 服务 | 用途 | 对外暴露 |
|---|---|---|---|
| 443 | Nginx stream | 统一公网入口 | 是 |
| 8080 | Nginx HTTPS 主站,WS 域名 | 按 server_name 区分主站和 WS 后端 | 否,仅本机 |
| 10443 | Xray Reality | Reality inbound | 否,仅本机 |
| 20443 | Xray WebSocket | WS inbound | 否,仅本机 |
之前的教程里 WS 和 Reality 都曾使用 10443,合并到并行版时容易冲突。本文明确把 Reality 放在 10443,把 WS 放在 20443。
步骤一:Cloudflare DNS
在 Cloudflare 添加:
| 类型 | 名称 | 内容 | 代理状态 | 用途 |
|---|---|---|---|---|
| A | @ | <VPS_IP> | 按主站需要设置 | 主域名 |
| A | www | <VPS_IP> | 按主站需要设置 | 主站 |
| A | ws | <VPS_IP> | Proxied | WS 保底线路 |
Cloudflare SSL/TLS 推荐使用 Full (strict)。如果源站证书还没准备好,可以临时使用 Full,但发布前应该补齐有效证书并复测。
步骤二:生成 Xray 参数
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 配置
编辑:
vim /usr/local/etc/xray/config.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" } ] }}检查并启动:
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 示例:
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 后端
创建:
vim /etc/nginx/conf.d/ws.example.com.conf写入:
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 统一入口
编辑:
vim /etc/nginx/nginx.conf在最外层加入:
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; }}检查并重载:
nginx -tsystemctl reload nginxss -tulnp | grep -E ':443|:8080|:10443|:20443'步骤七:防火墙
只开放公网入口:
ufw allow 22/tcpufw allow 443/tcpufw deny 8080/tcpufw deny 10443/tcpufw deny 20443/tcpufw enableufw status云安全组同样只需要开放 22 和 443,除非主站还有 80 跳转需求。
步骤八:分支验证
验证 Xray 监听:
systemctl is-active xrayss -tlnp | grep -E ':10443|:20443'验证 Nginx:
nginx -tsystemctl is-active nginxss -tlnp | grep ':443'验证 WS 后端:
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'验证主站:
curl -Iv https://example.com最后用客户端分别测试两个节点。不要只测其中一个,否则并行方案的备用价值无法确认。
客户端节点一:Reality 主力
| 参数 | 值 |
|---|---|
| 地址 | <SERVER_IP> |
| 端口 | 443 |
| UUID | <UUID> |
| Flow | xtls-rprx-vision |
| 传输 | tcp |
| TLS | reality |
| SNI | www.microsoft.com |
| Fingerprint | chrome |
| PublicKey | <PUBLIC_KEY> |
| ShortId | <SHORT_ID> |
客户端节点二:WS 保底
| 参数 | 值 |
|---|---|
| 地址 | ws.example.com |
| 端口 | 443 |
| UUID | <UUID> |
| Flow | 留空 |
| 传输 | ws |
| 路径 | /gl2025ws |
| TLS | tls |
| SNI | ws.example.com |
| Host | ws.example.com |
切换逻辑
平时使用:Reality 节点 -> VPS:443 -> Nginx stream default -> Xray:10443 备用切换:WS 节点 -> Cloudflare -> VPS:443 -> Nginx stream ws.example.com -> Nginx:8080 -> Xray:20443切换后要验证三件事:
- 真连接延迟有返回。
- 出口 IP 和 DNS 行为符合预期。
- 常用网站、包管理器或工作流能稳定访问。
小结
并行版的关键是清晰分层:
- Nginx stream 只负责 443 入口和 SNI 分流。
- 主站、WS 反代、Reality inbound、WS inbound 使用不同本机端口。
- Reality 是主力低延迟线路。
- WS + Cloudflare 是备用线路和源站隐藏入口。
- 两个客户端节点都必须定期验证,备用线路不能等故障时才第一次测试。
部署完成后,建议继续看 最终总结与故障切换清单,把端口、参数和验证命令整理成运维检查表。
按文章步骤复核自己的 VPS、域名、端口和客户端参数。
这篇已经可以直接看完,可以继续下一篇。
按顺序继续补齐上下文
同一 VLESS/Xray 自建代理系列的延伸阅读。
同一 VLESS/Xray 自建代理系列的延伸阅读。
同一 VLESS/Xray 自建代理系列的延伸阅读。
同一 VLESS/Xray 自建代理系列的延伸阅读。
同一 VLESS/Xray 自建代理系列的延伸阅读。