XrayR 连接 V2Board TLS 超时故障排查与解决
适用场景:XrayR 节点在启动或定时拉取配置时,无法通过 https://.../api/v1/server/... 地址获取 V2Board 配置信息,日志报 TLS handshake timeout,而在服务器上使用 ping 或 curl 测试同一地址却正常。
1. 问题表现
2025/06/02 06:15:32.674387 WARN RESTY Get "https://xin.students.xin/api/v1/server/UniProxy/config?node_id=66&node_type=shadowsocks&token=xxx": net/http: TLS handshake timeout, Attempt 1
-
症状:XrayR 持续重试获取配置,始终超时,面板上节点离线。
-
排查:
-
ping xin.students.xin 正常;
-
curl -I https://xin.students.xin/api/v1/server/... 正常返回 200;
-
仅 XrayR 访问失败。
-
2. 环境信息
组件 | 版本 | 备注 |
---|---|---|
操作系统 | CentOS 7 | |
XrayR | 0.9.0 | systemd 服务 |
V2Board | 宝塔面板 + Nginx | |
Nginx | 1.24 | 在宝塔中开启 强制 HTTPS |
3. 原因分析
-
强制 HTTPS 跳转
宝塔面板的 一键强制 HTTPS 会为站点注入 301/302 重定向规则:if ($server_port !~ 443) { return 301 https://$host$request_uri; }
-
XrayR 获取配置流程
-
默认由 config.yml 中的 ApiAddress: 指定协议与端口。
-
当设置为 https:// 时,XrayR 需要完成 TLS 握手;若网络抖动或证书链下载缓慢,即可能在 5 s 默认握手超时时间内失败。
-
-
Curl 能访问而 XrayR 失败的原因
-
curl 支持 HTTP/2、缓存证书链,并允许重试;
-
XrayR 内置的 Resty HTTP 客户端握手超时后直接返回错误,不会降级或重试。
-
4. 解决方案
方案一:关闭强制 HTTPS(推荐)
-
登录宝塔面板 → 网站 → 站点设置 → SSL → 关闭 强制 HTTPS。
-
在 XrayR/config.yml 中将
ApiAddress: "https://xin.students.xin"
改为
ApiAddress: "http://xin.students.xin"
-
systemctl restart xrayr,观察日志已无报错。
完。