通过 nodejs 在共享 cpanel 主机上实现 websocket 服务器

sae*_*ati 10 shared-hosting passenger cpanel websocket node.js

我已经获得了一个带有支持 nodejs 的 cpanel 的共享主机。我可以通过“设置 Node.js 应用程序”定义一个 node.js 应用程序。

我想做一个websocket。他们已经为我打开了 2088 端口。

这是我的 websocket 服务器代码:

const http = require('http');
const WebSocket = require('ws');

const server = http.createServer();
const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

server.listen(2088);
Run Code Online (Sandbox Code Playgroud)

好吧,我运行我的代码,然后将此请求从客户端发送到服务器:

socket = new WebSocket('ws://mydomain.com:2088');

socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');
});

socket.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);
});
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到超时错误,无法连接到 websocket 服务器。

似乎在共享 cpanel 主机上创建一个能够侦听特定端口的 websocket 服务器与通常的有点不同。

我已经浏览了互联网,我在 cpanel nodejs 上得到的只是如何使用 cpanel 菜单构建 node.js 应用程序。我找不到有关如何在共享 cpanel 主机上创建 websocket 的任何解释。所有消息来源都说可以使用 cpanel 上提供的 nodejs 制作 websocket。

现在,有没有人拥有具有 nodejs 功能的共享主机?并在其上运行 websocket?

那些把主机卖给我的管理员,完全是白痴,对此一无所知,也帮不了我……

提前感谢您的帮助。

更新:

如何在共享主机中运行 Node.js 和 python 与它们在 vps 中的运行方式不同。根据我的发现,phusion 乘客用于共享主机。我遇到的问题可以由曾在 Nodejs 共享主机上工作并了解phusion 乘客工作方式的人解决

ste*_*sas 7

对于从 cPanel UI 部署的节点应用程序,cPanel 依赖 Passenger 来管理部署。当发送 WebSockets 连接请求时,客户端通过请求中的Connection头发送 HTTP 请求以“升级” 。乘客响应标准 HTTP 请求,但不对Connection标头执行任何操作,因此实际上忽略了 WebSockets 请求。如果您在浏览器中打开 JS 调试器并检查 WebSockets 目标资源,您实际上可以看到这种情况发生。

Phusion 在 GitHub 上发布了一个使用socket.io的 WebSockets 演示。在演示的自述文件中,它指出 WebSockets 不能在乘客内部正常工作,因此它转而使用 HTTP 长轮询作为后备。但是,此回退是socket.io 中设计的一项功能,为了使其正常工作,必须将乘客配置为使用粘性会话,这是当前未向 cPanel 中的 UI 公开的选项。

如果您想使用 node 作为 WebSockets 服务器,您将需要在乘客之外运行它,因此很可能需要退出共享托管环境。在 cPanel 上运行它是可能的,但不能没有为您的帐户提升 shell 权限。

编辑:
你的问题真的让我很困扰,所以我又花了几个小时来研究它。如果你真的想从 cPanel 运行一个节点 WebSockets 服务器,你可以通过从你在 cPanel 应用程序管理器中注册的父应用程序使用永远调用你的服务器应用程序来实现这一点。父应用程序将从Passenger 执行,然后您的服务器应用程序将在Passenger 之外通过forever执行。乘客会抱怨使用节点集群模块,但它仍然可以工作。

请确保您的父应用程序响应 HTTP 请求,因为您至少需要发送一个请求才能在 Passport 中实例化它。