我正在使用 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。
谢谢你的帮助
我的评论的格式看起来不太好,所以我将进行一些猜测,并尝试回答您的帮助请求。
我的猜测是你正在使用的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。
编辑:修改路径,添加一些信息。