2012-05-03 61 views
9

我试图使用Node.js与Socket.IO来促进浏览器和客户端之间的消息传递,跟随the guide使用socket.io与服务器上的nodejs与Apache作为反向代理

但是,我不得不在Apache后面设置Node反向代理。所以,而不是example.com:8080节点,我使用example.com/nodejs/。

这似乎会导致Socket.IO失去它自己的感觉。这里是我的节点应用

var io = require('socket.io').listen(8080); 

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io 
io.set('resource', '/nodejs/socket.io'); 

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

    socket.emit('bar', { one: '1'}); 

    socket.on('foo', function(data) 
    { 
    console.log(data); 
    }); 

}); 

这是我的客户端文件是什么样子

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Socket.IO test</title> 

    <script src="http://example.com/nodejs/socket.io/socket.io.js"></script> 

    <script> 

    var socket = io.connect('http://example.com/nodejs/'); 

    console.log(socket); 

    socket.on('bar', function (data) 
    { 
    console.log(data); 
    socket.emit('foo', {bar:'baz'}); 
    }); 

    socket.emit('foo',{bar:'baz'}); 

    </script> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

这里的问题是脚本参考http://example.com/nodejs/socket.io/socket.io.js。它不返回预期的javasscript内容 - 而是返回“欢迎来到socket.io”,就像我击中http://example.com/nodejs/一样。

任何想法如何使这项工作?

+0

我知道这与手边的问题无关(如果我应该打开一个新的SO问题,请打电话给我),但我很好奇你的Apache httpd.conf是什么样的。我有代理设置传递给实际的node.js服务器,但是,我无法让websockets代理工作。你能举个例子说明你如何用Apache做这件事? – pmalbu

+0

对不起,但我不能。这个项目在2年前的黑客马拉松赛中完成,并且为其设置的服务器不再存在。 –

回答

7

这结束了多管齐下的解决方案。

首先,对事物的服务器端,我不得不设置端点这样

var io = require('socket.io').listen(8080); 

var rootSockets = io.of('/nodejs').on('connection', function(socket) 
{ 
    // stuff 
}); 

var otherSockets = io.of('nodejs/other').on('connection', function(socket) 
{ 
    // stuff 
}); 

然后,在客户端,以便正确地连接看起来像这样

var socket = io.connect(
    'http://example.com/nodejs/' 
    , {resource: 'nodejs/socket.io'} 
); 

// The usage of .of() is important 
socket.of('/nodejs').on('event', function(){}); 
socket.of('/nodejs/other').on('event', function(){}); 

之后,这一切都奏效了。请记住,在此服务器上,Apache正在代理example.com/nodejs以在内部端口8080。

+2

您使用的是哪个版本的socket.io?我尝试过提到的解决方案。但是,如果web套接字请求通过apache mod_proxy进行路由,则所有http头都会被删除。所以,socket.io关闭连接为“websocket连接无效”。 –

4

我不认为这与你的apache代理有什么关系,但是一些关于socket.io如何处理子目录请求的“怪癖”。在这里看到我的答案。 NGINX configuration to work with Socket.IO

基本上,你需要使用这个连接语句代替:

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

+3

从socket.io 1.0开始''{resource:...'被替换为'{path:...' – ceremcem

0

如果有人有兴趣,只有这对我有效。 与端口的NodeJS

的Apache 2.2.14更换端口3000您的虚拟主机里面

<IfModule mod_proxy.c> 
     <Proxy *> 
     Order allow,deny 
     allow from all 
     </Proxy> 
    </IfModule> 

    RewriteEngine on 

    RewriteCond %{QUERY_STRING} transport=polling 
    RewriteRule /(.*)$ http://localhost:3001/$1 [P] 

    ProxyRequests off 
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/ 
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/ 

客户端连接:

var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'}); 

无需对Node.js的一侧改变任何东西。

相关问题