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

问题描述 投票:0回答:2

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

我想制作一个网络套接字。他们给我开了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);

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

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);
});

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

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

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

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

把主机卖给我的管理员都是白痴,对此一无所知,也无法帮助我......

感谢您提前的帮助。

更新:

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

node.js websocket cpanel passenger shared-hosting
2个回答
6
投票

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

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

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

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

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


0
投票

这个问题解决了吗?我很想自己动手做这个!

© www.soinside.com 2019 - 2024. All rights reserved.