在共享 cpanel 主机上通过 Node.js 实现 WebSocket 服务器

13

我获得了一个支持Node.js的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);

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

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 Passenger。知道关于Phusion Passenger工作方式的人可以解决我遇到的问题。


你有没有尝试使用远程地址而不是 mydomain.com?ws://remote-addr:2088 - Ritesh Kumar Gupta
@ritesh_NITW 是的 - saeid ezzati
由于端口已经开放,可能是Windows Defender防火墙在阻止。如果是Windows服务器,请检查控制面板->系统和安全->Windows Defender防火墙->允许的应用程序列表中是否有node.js。 - Ritesh Kumar Gupta
@RiteshKumarGupta 操作系统是Linux CentOS。但是它是共享主机! - saeid ezzati
共享主机的问题是:它们肯定在前面设置了反向代理或负载均衡器。尽管他们已经为您开放了端口入站,但我不确定负载均衡器是否会将请求进一步转发到服务器。我会回来解决这个问题。 - Ritesh Kumar Gupta
@RiteshKumarGupta 如何在共享主机上运行Node.js和Python与它们在VPS中运行的方式不同。根据我所发现的,共享主机使用Phusion Passenger。我遇到的问题可以由曾在共享主机上使用Nodejs的人解决。 - saeid ezzati
1个回答

6
对于从cPanel UI部署的节点应用程序,cPanel依赖Passenger来管理部署。当发送WebSockets连接请求时,客户端通过请求中的Connection头部向上级提出HTTP请求以“升级”。Passenger会响应标准HTTP请求,但不会处理连接头部,因此WebSockets请求实际上被忽略了。如果您在浏览器内打开JS调试器并检查WebSockets目标资源,实际上可以看到这种情况正在发生。
Phusion在GitHub上发布了一个使用socket.io的WebSockets演示。在演示的自述文件中,它说明WebSockets在Passenger内无法正常工作,因此会转而使用HTTP长轮询作为后备。但是,这种后备是engineered into socket.io的功能,并且要使其正常工作,必须将Passenger配置为使用sticky sessions,但这个选项目前在cPanel中没有公开。
如果您想将节点用作WebSockets服务器,您需要将其运行在Passenger之外,因此最有可能需要摆脱共享主机环境。在cPanel上运行它是可能的,但是需要为您的帐户提高shell权限。
编辑:
你的问题让我很困扰,所以我又花了几个小时来解决它。如果你真的非常想从cPanel运行一个节点WebSockets服务器,你可以通过从注册在cPanel应用程序管理器中的父级应用程序中使用forever来调用你的服务器应用程序来实现这一点。父级应用程序将从Passenger执行,然后您的服务器应用程序将通过forever在Passenger之外执行。Passenger会抱怨使用Node Cluster模块,但它仍将工作。
请确保您的父级应用程序响应HTTP请求,因为您需要发送至少一个请求来在Passenger中实例化它。

你能进一步解释一下如何使用forever让它工作吗?我不确定你的设置具体是怎样的。 - rubixibuc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接