VPS 网络代理节点部署

这篇只做一件事:在 VPS 上搭一个单独的 Xray 代理节点,然后用 v2rayNG 连接。

不讲网站后台,不讲用户系统,不讲平台化管理,也不把 Xray 做成什么复杂服务。目标就是:一台 VPS、一个域名、一个 Xray 节点、一个 Android 客户端。

用途提醒:请只在你有权管理的 VPS 上部署,并遵守所在地法律、服务商条款和网络使用规范。

一、最终结构

采用这套最常见、好维护的结构:

  • 客户端:v2rayNG
  • 协议:VLESS
  • 传输:WebSocket,简称 WS
  • 加密层:TLS
  • 公网入口:Nginx 监听 443
  • Xray:只监听本机 127.0.0.1:10085

外部访问流程是:

v2rayNG → https://你的域名:443/你的WS路径 → Nginx → 127.0.0.1:10085 → Xray

二、准备域名和变量

先准备一个子域名,例如:

xray.example.com

把它的 A 记录解析到 VPS 公网 IP。然后在 VPS 上设置变量:

export XRAY_DOMAIN="xray.example.com"
export XRAY_EMAIL="admin@example.com"
export XRAY_PORT="10085"
export XRAY_WS_PATH="/ray-$(openssl rand -hex 4)"
export XRAY_UUID="$(cat /proc/sys/kernel/random/uuid)"

xray.example.com 和邮箱换成你自己的。XRAY_WS_PATH 会随机生成一个路径,例如 /ray-a1b2c3d4

三、安装 Nginx、Certbot、Xray

sudo apt update
sudo apt install -y curl nginx certbot python3-certbot-nginx

安装 Xray:

sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

检查 Xray 是否安装成功:

xray version

四、申请 HTTPS 证书

确认域名已经解析到 VPS 后执行:

sudo certbot --nginx -d "$XRAY_DOMAIN" -m "$XRAY_EMAIL" --agree-tos --no-eff-email

成功后证书路径是:

/etc/letsencrypt/live/$XRAY_DOMAIN/fullchain.pem
/etc/letsencrypt/live/$XRAY_DOMAIN/privkey.pem

五、写入 Xray 配置

把 Xray 配成 VLESS + WebSocket,只监听本机端口:

sudo tee /usr/local/etc/xray/config.json >/dev/null <<EOF
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": ${XRAY_PORT},
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "${XRAY_UUID}",
            "email": "phone@${XRAY_DOMAIN}"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "${XRAY_WS_PATH}"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}
EOF

检查配置并启动:

sudo xray run -test -config /usr/local/etc/xray/config.json
sudo systemctl enable --now xray
sudo systemctl restart xray
sudo systemctl status xray --no-pager

六、配置 Nginx 反代到 Xray

sudo tee /etc/nginx/sites-available/xray-${XRAY_DOMAIN}.conf >/dev/null <<EOF
server {
    listen 80;
    server_name ${XRAY_DOMAIN};
    return 301 https://\$host\$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ${XRAY_DOMAIN};

    ssl_certificate /etc/letsencrypt/live/${XRAY_DOMAIN}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${XRAY_DOMAIN}/privkey.pem;

    location ${XRAY_WS_PATH} {
        proxy_pass http://127.0.0.1:${XRAY_PORT};
        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;
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/xray-${XRAY_DOMAIN}.conf /etc/nginx/sites-enabled/xray-${XRAY_DOMAIN}.conf
sudo nginx -t
sudo systemctl reload nginx

这就是一个单独代理节点:访问普通网页返回 404,只有正确的 WebSocket 路径会转到 Xray。

七、放行端口

只放行 80 和 443。不要把 Xray 的 10085 暴露到公网。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

如果 VPS 厂商有安全组,也要在控制台放行 80/443。

八、记录客户端参数

执行下面命令,把输出保存下来:

echo "别名: 我的Xray节点"
echo "地址: ${XRAY_DOMAIN}"
echo "端口: 443"
echo "UUID: ${XRAY_UUID}"
echo "协议: VLESS"
echo "加密: none"
echo "传输: ws"
echo "路径: ${XRAY_WS_PATH}"
echo "TLS: tls"
echo "SNI: ${XRAY_DOMAIN}"
echo "Host: ${XRAY_DOMAIN}"

九、v2rayNG 手动填写

打开 v2rayNG,点右上角 +,选择 手动输入[VLESS]

  • 别名:我的Xray节点
  • 地址:你的域名,例如 xray.example.com
  • 端口:443
  • 用户 ID:XRAY_UUID
  • 额外 ID:0 或留空
  • 加密方式:none
  • 传输协议:ws
  • 伪装类型:none
  • 伪装域名 / Host:你的域名,例如 xray.example.com
  • 路径 / Path:你的 WS 路径,例如 /ray-a1b2c3d4
  • 传输层安全:tls
  • SNI:你的域名,例如 xray.example.com
  • AllowInsecure:关闭
  • Fingerprint:chrome 就选 chrome,没有就默认

保存后选中这个节点,点右下角连接按钮即可。

十、生成 VLESS 分享链接

如果不想手动填,可以生成链接后导入 v2rayNG:

python3 - <<PY
import os, urllib.parse
uuid = os.environ["XRAY_UUID"]
domain = os.environ["XRAY_DOMAIN"]
path = urllib.parse.quote(os.environ["XRAY_WS_PATH"], safe="")
name = urllib.parse.quote("我的Xray节点")
print(f"vless://{uuid}@{domain}:443?encryption=none&security=tls&sni={domain}&type=ws&host={domain}&path={path}#{name}")
PY

复制输出的 vless:// 链接,在 v2rayNG 里选择从剪贴板导入。

十一、排障只看这几项

  • 域名:dig +short xray.example.com 是否指向 VPS。
  • 端口:VPS 防火墙和云安全组是否放行 443。
  • Nginx:sudo nginx -t 是否通过。
  • Xray:sudo journalctl -u xray -n 100 --no-pager 是否有报错。
  • 客户端:UUID、WS 路径、TLS、SNI、Host 必须和服务端一致。

最容易填错的是 PathSNI:Path 必须带 /,SNI 必须填域名,不能填 IP。

十二、以后怎么维护

  • 重启 Xray:sudo systemctl restart xray
  • 看 Xray 状态:sudo systemctl status xray --no-pager
  • 看日志:sudo journalctl -u xray -f
  • 改配置前备份:sudo cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak.$(date +%F-%H%M)
  • 更新 Xray:sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

到这里,一个单独的 Xray 代理节点就完成了。核心参数只有六个:域名、端口 443、UUID、WS 路径、TLS、SNI。客户端填对这六项,基本就能连上。