DigitalOcean Ubuntu服务器WebSocket无法远程连接求助
解决远程WebSocket连接失败的问题
针对你遇到的本地能连接WebSocket服务、远程无法连接的问题,按以下步骤排查:
1. 修改服务端监听地址
你的当前代码中,WebSocket服务默认只监听localhost(127.0.0.1),仅允许本地访问。需要修改为监听所有网卡地址0.0.0.0,这样远程才能访问:
// server.ts 修改后的代码 import ws from "ws"; const wss = new ws.Server({ port: 3002, host: '0.0.0.0' // 新增该行,允许所有网卡接收连接 }); const handler = applyWSSHandler({ wss, router: appRouter, createContext }); console.log("WebSocket Server listening on ws://0.0.0.0:3002");
修改后重启服务,用以下命令确认监听地址:
ss -tulpn | grep 3002
输出中如果显示0.0.0.0:3002,说明监听设置正确。
2. 检查Ubuntu系统防火墙
如果Ubuntu开启了ufw防火墙,需要允许3002端口的TCP入站连接:
# 查看防火墙状态 sudo ufw status # 允许3002端口 sudo ufw allow 3002/tcp
若使用iptables,执行:
sudo iptables -A INPUT -p tcp --dport 3002 -j ACCEPT # 保存规则(根据系统不同可能有差异) sudo iptables-save > /etc/iptables/rules.v4
3. 检查DigitalOcean云防火墙
登录DigitalOcean控制台,找到对应Droplet的Networking选项卡,进入Firewall设置:
- 添加入站规则,协议选择TCP,端口填写3002,来源选择
Anywhere(或指定你的客户端IP) - 确保该防火墙规则已绑定到你的Droplet
4. 排查客户端连接问题
如果以上步骤完成后仍无法连接,在客户端代码中添加错误和关闭事件监听,获取具体报错信息:
// client.js 新增监听 const ws = new WebSocket('ws://xxx.xxx.xxx.xxx:3002'); ws.onopen = function (event) { console.log('connected'); }; ws.onerror = function(error) { console.error('WebSocket error:', error); }; ws.onclose = function(event) { console.log('WebSocket closed:', event.code, event.reason); };
同时可以在客户端机器上用以下命令测试端口连通性:
nc -zv xxx.xxx.xxx.xxx 3002
如果命令返回成功,说明网络通了,再排查WebSocket层面的问题;如果失败,回到前面的防火墙/监听设置步骤重新检查。
内容的提问来源于stack exchange,提问作者sciffany
相关产品推荐
相关产品推荐

