You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:01:24