这篇只做一件事:在 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 必须和服务端一致。
最容易填错的是 Path 和 SNI: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。客户端填对这六项,基本就能连上。