2011-09-12 11 views
10

Espero que esto no parezca una pregunta terriblemente tonta, pero estoy aprendiendo cómo implementar un servidor socket.io para que mi sitio web produzca aplicaciones en tiempo real, pero Mi problema es que no puedo entender cómo implementar dichas aplicaciones en un entorno servido por Apache. Actualmente, cuando ejecuto node server.js para iniciar mi servidor socket.io, tengo que acceder a él visitando http://localhost:XXXX donde XXXX es el puerto al que lo conecto, naturalmente. No quiero que mi sitio web sea forzado a ser visto en un puerto alternativo como este, pero obviamente no puedo conectar el servidor al puerto 80 ya que Apache está escuchando eso.Acceso al servidor socket.io a través de las páginas servidas de Apache

Obviamente, una solución natural sería detener el servicio Apache y luego nodo el servidor en el puerto 80 de esa manera para evitar una colisión, pero no quiero sacrificar toda la funcionalidad que ofrece Apache. Básicamente, quiero continuar sirviendo a mi sitio web a través de Apache en el puerto 80 e integrar ciertos aspectos de las aplicaciones en tiempo real a través de socket.io en el puerto 3000, digamos.

¿Hay alguna manera de hacer esto para evitar las cosas que no quiero? Esas cosas son 1) hacer que los usuarios accedan a mi sitio con :3000 en la URL, 2) desactivar Apache, 3) usar iframes.

Gracias de antemano.

Respuesta

3

Generalmente, debería poder ocultar Node.js con mod_proxy. Un poco de búsqueda apareció esto: https://github.com/sindresorhus/guides/blob/master/run-node-server-alongside-apache.md (el enlace antiguo murió, este es uno nuevo)

Sin embargo, Socket.io puede ser un poco quisquilloso (https://github.com/LearnBoost/socket.io/issues/25), por lo que puede tener problemas específicamente.

Como ese boleto es un poco viejo, vale la pena intentarlo. Simplemente no te sorprendas si tienes problemas. La siguiente apuesta es enlazar Node.js toport 80 y hacer que actúe como un proxy inverso para Apache con https://github.com/nodejitsu/node-http-proxy (aún bajo un poco de desarrollo).

La solución óptima sería ejecutarla en su propio servidor y simplemente hacer que el tráfico del socket vaya a socket.example.com o algo así.

+0

El segundo método enumerado es el que he implementado hasta ahora, aunque requirió una cantidad bastante extensa de reconfiguración de las directivas Apache. Ahora que está implementado, siento que todo el proceso ha sido contra intuitivo y realmente no me ha dejado más cerca de lo que necesito lograr, además de vincular ambos servidores al "mismo" puerto. Creo que veré más en mod_proxy y veré si esa no es una solución más prudente. Un problema recurrente es que no necesariamente debo enviar documentos completos con socket.io ... simplemente WIDGETS en páginas seleccionadas. Un "div portado", si se quiere. –

+0

El primer enlace que menciona está muerto –

+0

Actualizado con un nuevo enlace –

2

Socket.io tiene múltiples mecanismos de transporte. Algunos de ellos no funcionan si ejecuta Apache como proxy inverso, pero algunos sí lo hacen. Los transportes que no funcionan son websocket y flash, pero xhr-polling y jsonp-polling deberían funcionar.

Este es un ejemplo sobre cómo configurar la opción de configuración para los transportes socket.io:

var io = require("socket.io").listen(server); 
io.set("transports", ["xhr-polling", "jsonp-polling"]); 

En mi Apache estoy usando el name based virtual hosts and reverse proxy setup normales y con estos transportes el socket.io parece estar funcionando.

Cuestiones relacionadas