【问题标题】:Socket.io connection to server doesn't work sometimesSocket.io 连接到服务器有时不起作用
【发布时间】:2013-11-22 11:59:34
【问题描述】:

我已经在 VPS 上设置了一个带有 socket.io 的 Node.JS 服务器,我每 10 秒向所有人广播连接的客户端数量。这通常工作正常,但通常无法建立连接并且我收到此错误(我更改了一点 IP):

GET http://166.0.0.55:8177/socket.io/1/?t=1385120872574

重新加载站点后,通常可以建立连接,虽然我不知道为什么会首先发生连接失败,也不知道如何调试socket.io代码。有时我无法连接到服务器,我必须重新启动服务器。

其他信息:

  • 我的主站点运行在与 Node.js 服务器不同的服务器上(使用带有 CakePHP 的 LAMP 环境)。
  • 我用forever来运行服务器
  • 我有很多连接的客户端(大约 1000 个)
  • 我的 VPS 有 512 MB 内存,CPU 从未高于 25%

【问题讨论】:

  • 您的节点进程 CPU 是否达到 100%? (只是节点 CPU 不是整个服务器)因为 Node.js 是单线程。
  • Mh.. 不知道如何检查这个,我真的是服务器端的新手:/
  • 在 linux shell 中尝试“top”命令并找到 node.js 进程。
  • 啊,非常感谢!目前它为 10%,尽管它跃升至 20%,然后又返回。现在服务没有问题(我得到了连接的客户端),但如果脚本再次开始失败,我会看看 TOP :)
  • 连接当前每秒钟工作一次(如果我重新加载,它可以工作,再次重新加载,它不会)。节点进程使用大约 15% 的 CPU 和 13% 的 MEM。还有 2 个其他进程使用的 CPU 和 MEM 均低于 1%。

标签: node.js socket.io vps


【解决方案1】:

top 命令后,尝试:

socket.on('error', function (err) { 
   console.log("Socket.IO Error"); 
   console.log(err.stack); // this is changed from your code in last comment
});

另外,您可以尝试使用较慢的传输方式。 Socket.io 默认使用 Websocket,但如果您的服务器无法分配足够的资源,您可以尝试另一种速度较慢但使用较少资源的传输方式

io = socketIo.listen(80);
io.set('transports', ['xhr-polling']);

【讨论】:

  • 当我将代码更改为console.log(err.stack) 时,我得到一个未定义的。我是否必须从服务器发送一些东西才能完成这项工作?
  • io.set('transports', ['xhr-polling']); 似乎已经解决了这个问题,因此我将答案标记为正确:) 有没有办法调试“无法分配足够的资源”问题?更大/更强的 VPS 会解决这个问题吗?
  • 您可以随时重现问题吗?或者它只是在很多分钟后才发生的?就个人而言,我认为这可能与您的服务器无关。您可以在另一个根本没有用户的空白 vps 上尝试它。如果它仍然发生,您的 vps 可能有阻止 Websocket 连接的东西。
  • 每次我停止脚本并重新启动服务器时,它起初工作正常,但随着时间的推移(2-3 小时后)它开始失败。大约 5 小时后,它通常会失败(如果我重新加载站点,它会工作大约五分之一,通常使用长轮询后备而不是 websockets)。如果他们熟悉这个问题,我会请求数字海洋的支持:)
  • 任何其他解决方案?
最近更新 更多