最近我一直在搞弄socket.io和node.js,在成功制作了一个基于聊天的应用程序之后,我想制作另一个类似的Web应用程序。我完成了它,当我在计算机上本地托管时,一切工作正常,但是一旦将其放在Web服务器上,它便停止工作。 Node可以很好地为页面提供服务,但是没有建立socket.io连接。这是因为我如何配置Apache代理设置以使以前的应用程序正常工作。一些背景知识:
当我完成第一个程序时,我很难在远程服务器上运行。我将应用程序托管在端口3000上,并试图让Apache将某个URL转发到该端口。我希望http://example.com/app1
从本质上转发到http://example.com:3000
。在将ProxyPass /app1 http://localhost:3000
添加到Apache的配置文件后,我发生了这种情况,这使我处于与上述类似的情况。页面本身加载正常,但未建立与socket.io的实际连接。我意识到问题是客户端正在URL http://example.com/socket.io
上寻找socket.io。由于仅将子目录/app1
转发到端口3000,因此客户端将无法正确连接到服务器,这是有道理的。为了解决这个问题,我在Apache的配置文件中添加了ProxyPass /socket.io http://localhost:3000/socket.io
。这基本上解决了问题,因为现在所有对socket.io的请求都已发送到正确的端口。
这对我来说很好,直到我想在另一个端口上设置第二个应用程序为止。第二个应用程序的客户端具有地址http://example.com/app2
,该地址再次使用ProxyPass /app2 http://localhost:3001
转发到Web服务器上的端口3001。如我之前所述,页面本身可以很好地加载,但是未建立socket.io连接。这个新的客户端页面再次将所有socket.io请求发送到http://example.com/socket.io
。您可能会猜到来自第二个应用程序的客户端页面的所有流量都被发送到错误的服务器。我将转发/socket.io
的端口从3000更改为3001,以允许第二个应用程序正常运行,但是现在第一个应用程序有完全相同的问题。
无论我做什么,我都无法获得客户端页面来请求socket.io位于http://example.com/app1/socket.io
之类的应用程序URL下。我可以将客户端页面中的脚本源代码行更改为<script src="app1/socket.io/socket.io.js"></script>
(带有或不带有开头的“ /”),但仍然无法正常工作。我认为问题本质上在于试图找到一种方法来同时运行两个完全独立的node.js / socket.io服务器。
TL; DR:如何在同一Apache服务器上同时运行两个socket.io服务器?
答案 0 :(得分:0)
如您所见,默认情况下,socket.io使用相同的URL初始化所有连接。默认情况下,您的两个应用程序将使用完全相同的URL,因此您的Apache服务器无法分辨出哪个是不同代理服务器。
因此,解决此问题的唯一方法是将一个socket.io安装(客户端和服务器)配置为使用自定义路径,然后可以与默认的socket.io路径分开进行代理传递。
您可以按照here的说明在构建服务器时设置服务器路径。
const server = require('http').createServer();
const io = require('socket.io')(server, {
path: '/myownpath'
});
server.listen(3000);
您可以按照here中所述在客户端中进行连接时设置客户端请求路径。
const socket = io('http://localhost', {
path: '/myownpath'
});