先分析页面实际怎么请求
浏览器打开 http://XX:32218/... ← 本机宝塔 nginx,正常
↓ 反代到 xx:32218
页面 GET /api/xx/wss-base
→ {"base":"wss://xx"}
然后 new WebSocket(
wss://xx/osd
wss://xx/map/trajectory
)
32218 只负责前端壳;OSD/轨迹 WebSocket 打到 xx:443 。
本机连续探测该 OSD 地址:20 次里约 10 次成功、10 次「连接被对方重置」------与「不规律出现」完全一致。
具体问题点(间歇性根因)
同一台机的 :443 被两个进程同时占用(SO_REUSEPORT):
| 进程 | 角色 | 对 /dj-prod-api/.../osd |
|---|---|---|
cilium-envoy |
Cilium Gateway(平台路由 → uav-nginx) |
正常 101 |
envoy(Higress gateway,hostNetwork=192.168.1.100) |
Higress,无正确业务路由 | 失败 / RST |
内核把新连接随机分给两者 → 大约一半成功、一半 RESET 。
这不是 32218 前端坏了,也不是前端写死 1235(这个监控页走的是 wss-base → 443)。
另外:宝塔仍配置了 listen 11081 ssl(xx_11082.conf),但当前 11081 实际由 cilium-envoy 占用;配置冲突也要清理,以免以后再抢端口。
怎么修
首选:消掉 443 双占用(根治)
任选其一:
- 若 Higress 不用 :缩容/停掉
higress-system/higress-gateway,让 443 只留给 Cilium - 若 Higress 还要:改掉它的 hostNetwork / 不要绑宿主机 80、443(改成 ClusterIP + 单独 NodePort,或别的端口)
修完后验证:
bash
sudo lsof -iTCP:443 -sTCP:LISTEN | awk '{print $1}' | sort -u
# 应只剩 cilium-envoy(或只剩你选定的那一个)
再压测 OSD,成功率应接近 100%:
bash
# 连续打 wss 升级,不应再大量出现「连接被对方重置」
临时绕过(不改网关抢端口)
把 /api/XXX/wss-base 的返回改成只走 Cilium 独占端口,例如:
json
{"base":"wss://XXXX:11081"}
(11081 上 OSD/FLV 之前测过可 101;改的是 192.168.100.168 上该 Next 服务的配置/环境变量,不是 32218 反代本身。)
浏览器侧怎么确认
在该监控页打开 DevTools → Network → WS:
- 失败连接目标应是
wss://XXX/osd(或 trajectory) - 状态为
(failed) net::ERR_CONNECTION_RESET - 刷新多次会有时成功有时失败
一句话 :RESET 来自它连接的 wss://XXX:443,因 Cilium 与 Higress 同时占用 443 导致约一半连接被错误网关重置。先去掉 Higress 对宿主机 443 的占用,或把 wss-base 改到仅 Cilium 的 11081。