在带有apache的服务器上使用socket.io和nodejs作为反向代理

我正试图使用​​Node.js和Socket.IO在浏览器和客户端之间进行消息传递,遵循指南 。

但是,我不得不在Apache后面设置反向代理。 所以,而不是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内容,而是返回“Welcome to socket.io”,就像我点击http://example.com/nodejs/一样 。

任何想法如何我可以使这项工作?

这最终成为一个多方面的解决scheme。

首先,在服务器端,我必须像这样设置端点

 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。

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

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

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

如果有人有兴趣,只有这对我有效。 用您的Nodejs端口replace端口3000

你的VirtualHost里面的Apache 2.2.14

  <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端更改任何内容。