我正在使用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.
感谢您的帮助
答案 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。
编辑:更正路径,添加一些信息。