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

时间:2014-08-06 08:21:22

标签: apache websocket socket.io reverse-proxy

我正在使用Socket.io ver 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

我不想在节点服务器命名空间中使用,而只是将来自url的所有数据用/ node路由到端口5000.

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

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

所以最后,尽管存在上述错误,您仍然可以使设置正常工作。

为此,正如我的评论中所述,我建议您按照以下方式更改io.connect:

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

您仍然会收到此错误,但您的服务器和客户端仍然可以进行通信。

接下来,如果你想摆脱这个错误,我建议使用mod_proxy_wstunnel,它可以用于apache 2.4(显然有些人设法为2.2构建它,所以你也可以试试)

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

编辑:更正路径,添加一些信息。