提问者:小点点

Socket.io Apache 反向代理无法连接


我正在使用 Socket.io 版本1.0.6。我在使用 socket.io 和 apache 代理时遇到问题。

代理在 vhots 中定义,如下所示:

    ServerAdmin webmaster@localhost
    ServerName site.loc
    DocumentRoot /home/site/Private/dev/site

    ProxyPass /node http://localhost:5000
    ProxyPassReverse /node http://localhost:5000

所以网址 http://site.loc/node 应该运行 http://site.loc:5000

节点服务器如下所示:

var port = 5000;
var server = require('http').Server();
var io = require('socket.io')(server);

io.on('connection', function(socket){

});

server.listen(port);
console.log('Listening on port: ' + port);

和客户:

var socket = io.connect('ws://site.loc', {path: '/node/socket.io'});

我收到的信息是

WebSocket握手期间出错:意外响应代码:400

我不想使用节点内服务器名称空间,但只将所有数据从带有/node的url路由到端口5000。

谢谢你的帮助


共1个答案

匿名用户

我的评论的格式看起来不太好,所以我将进行一些猜测,并尝试回答您的帮助请求。

我的猜测是你正在使用的apache 2.2不太了解ws协议。但是,socket.io 仍然能够故障转移AFAIK。

因此,最终,尽管存在上述错误,您应该能够使设置正常工作。

为此,正如我在评论中所说的,我建议您如下更改您的io.connect:

var socket = io({path: '/node/socket.io'});

您仍然会收到此错误,但您的服务器和客户端应该仍然能够通信。

接下来,如果您希望消除这个错误,我建议使用mod_proxy_wsunnel,它适用于apache2.4(显然有些人也为2.2构建了它,所以您也可以尝试一下)

更新:看起来较新的 socket.io 更改了 http 和 ws 的路径(以前是不同的,但现在基于相同的路径,后跟特定查询) 看看这个讨论这个线程: https://community.rackspace.com/developers/f/7/t/3477 看起来nginx对websockets有更好的支持,应该是这里的首选解决方案。可能值得研究一下在 socket.io 查询中检测“传输”参数的方法,以便让 apache 知道将哪种协议用于 ProxyPass。

编辑:修改路径,添加一些信息。