2012-05-03 16 views
9

Estoy intentando usar Node.js con Socket.IO para facilitar la mensajería entre el navegador y el cliente, siguiendo the guide.Usando socket.io con nodejs en un servidor con apache como proxy inverso

Sin embargo, tuve que configurar el nodo de proxy inverso detrás de Apache. Entonces, en lugar de example.com:8080 para node, estoy usando example.com/nodejs/.

Esto parece causar que Socket.IO pierda sentido de sí mismo. Aquí está mi aplicación nodo

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); 
    }); 

}); 

Y esto es lo que se ve mi archivo del cliente como

<!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> 

El problema aquí es la referencia de secuencia de comandos para http://example.com/nodejs/socket.io/socket.io.js. No devuelve el contenido esperado de javasscript, sino que devuelve "Bienvenido a socket.io" como si tocara http://example.com/nodejs/.

¿Alguna idea de cómo puedo hacer que esto funcione?

+0

Sé que esto no está relacionado con la pregunta en cuestión (y por favor llámeme si debo abrir una nueva pregunta de SO), pero tengo curiosidad sobre cómo es su Apache httpd.conf. Tengo proxying configurado para pasar al servidor node.js real, sin embargo, no puedo hacer funcionar el proxy websockets. ¿Podría dar un ejemplo de cómo está haciendo esto con Apache? – pmalbu

+0

Lo siento, pero no puedo. Este proyecto se realizó en un hackathon hace más de 2 años y el servidor que se creó para él ya no existe. –

Respuesta

7

Esto terminó siendo una soluciones de diversas facetas.

En primer lugar, en el lado del servidor de las cosas, tuve que establecer los criterios de valoración como esto

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 
}); 

A continuación, en el lado del cliente, para conectar correctamente tiene este aspecto

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(){}); 

Después de esto, todo funcionó. Recuerde, en este servidor Apache está proxysando example.com/nodejs al puerto 8080 internamente.

+2

¿Qué versión de socket.io usó? Probé la solución mencionada. Pero todos los encabezados http se eliminan si la solicitud de socket web se enruta a través de apache mod_proxy.Entonces, socket.io cierra la conexión como "conexión websocket inválida". –

4

No creo que esto tenga algo que ver con su proxy apache, pero algunos 'caprichos' con la forma en que socket.io maneja las solicitudes en un subdirectorio. Vea mi respuesta aquí. NGINX configuration to work with Socket.IO

Básicamente, es necesario utilizar esta sentencia de conexión en su lugar:

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

+3

A partir de socket.io 1.0 '{resource: ...' se reemplaza por '{ruta: ...' – ceremcem

0

Si alguien está interesado, solo esto funcionó para mí. Reemplazar el puerto 3000 con el puerto nodejs

Apache 2.2.14 dentro de su VirtualHost

<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/ 

conexión del lado del cliente:

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

No hay necesidad de cambiar nada en el lado Node.js.

Cuestiones relacionadas