2012-02-21 25 views
7

Así que he estado tratando de hacer que esto funcione 2 días y estoy atascado. Esta es la primera vez que configuro un servidor para raíles que usa NodeJS + Socket IO. Soy un novato con NGINX y Unicornio. Básicamente, la parte NodeJS + SocketIO de mi aplicación enviará mensajes a los usuarios que están conectados a mi aplicación. Este es mi nginx.confconfiguración NGINX para trabajar con Socket.IO

server{ 
    listen 80 default; 
    root /home/deployer/saigon/public; 
    try_files $uri/index.html $uri @unicorn; 

    location /sockets { 
     proxy_pass http://localhost:3210; 
    } 

    location @unicorn { 
     proxy_pass http://localhost:3000; 
    } 
} 

Y en mi production.rb, que han configurado la URL del cual el usuario tendrá que enviar el mensaje de

SOCKET_IO_URL ='http://localhost:8080/sockets 

Por qué 8080 a/recepción de mensajes? Yo uso Vagrant para reenviar 8080 -> 80

Intenté acceder a http://localhost:8080/sockets y pude obtener el mensaje de bienvenida de socket. Miré el registro de mi servidor NodeJS y estaba recibiendo mensajes bien. Sin embargo, cuando se trata de transmitir ... simplemente no lo hace. ¿Alguna vez alguien ha conseguido que este tipo de aplicación funcione con la configuración que estoy tratando de hacer? ¿Debería ir con Apache + Unicornio?

'

Respuesta

12

respuesta Actualizado

por fin he encontrado una manera de conseguir este trabajo. No es para nada obvio, pero cuando alojas socket.io en una subcarpeta, NO usas la subcarpeta en la declaración de conexión. Esto es lo que estaba haciendo antes y el cliente nunca recibió una respuesta.

no funciona

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

http://localhost:8080/test/ Esta es la parte que está lanzando cosas fuera. Eso crea un espacio de nombres para el socket local que el lado del servidor no respeta. Entonces el cliente envía el mensaje en el espacio de nombres '/ test /' pero las respuestas del servidor van a un espacio de nombre vacío '' para que el cliente nunca reciba los mensajes. La solución consiste en eliminar simplemente '/ test /' y asegurarse de que está utilizando la variable de recurso en el cliente y el servidor.

¡Trabajando!

<script src="/test/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'}); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

espero que esto ayuda a hacer las cosas de trabajo en su final.

respuesta original

No es un problema con su configuración, se trata de un problema de socket.io no querer trabajar en la subcarpeta. Apostaría a estar dispuesto a ser que si dejaras caer los sockets tu ejemplo funcionaría bien. Me encontré con exactamente el mismo problema cuando se utiliza http-node-proxy tratando de alojar conexiones socket.io en subcarpetas. Hubo un error creado hace un tiempo, pero se cerró y nunca se resolvió.

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

Todavía estoy buscando una solución así, pero tengo la sensación de que voy a tener que subirse las mangas y cavar en el código mismo.

+0

por lo que básicamente socket/socket.io necesita permanecer en la carpeta raíz, entonces .... lo que significa que tengo que saber qué solicitud va a raíles y cuál va a socket io cuando llegue a raíz? = ___ = argh – denniss

+0

Por ahora sí. Si es posible, puede usar una ruta de subdominio. http://socket.domain.com/. Esto no funcionó para mí porque no quería gastar más dinero en un certificado SSL para un subdominio. –

+0

@denniss He actualizado mi respuesta con una solución. Aún profundizando en él para descubrir si este es el diseño previsto o un error que debe solucionarse. –