¿Configurando múltiples aplicaciones socket.io/node.js en un servidor Apache?

He estado jugando con socket.io y node.js recientemente y después de hacer una aplicación basada en chat con éxito, quería hacer otra aplicación web similar. Lo completé y todo funcionaba bien cuando estaba alojando localmente en mi computadora, pero una vez que lo puse en mi servidor web, dejó de funcionar. El nodo estaba sirviendo la página muy bien, pero la conexión socket.io no se estaba realizando. Esto se debe a la forma en que configuré la configuración del proxy de Apache para que la aplicación funcionara. Algunos antecedentes sobre eso:

Cuando terminé el primer progtwig, tuve dificultades para ejecutarme en el servidor remoto. Estaba alojando la aplicación en el puerto 3000 y estaba intentando que Apache reenviara una determinada URL a ese puerto. Quería que http://example.com/app1 remita esencialmente a http://example.com:3000 . Logré que esto ocurriera después de agregar ProxyPass /app1 http://localhost:3000 al archivo de configuración de Apache, y eso me puso en una situación similar a la que describí anteriormente. La página en sí se cargó bien, pero no se realizó una conexión real a socket.io. Me di cuenta de que el problema era que el cliente estaba buscando socket.io en la url http://example.com/socket.io . Dado que solo el subdirectorio /app1 se reenvía al puerto 3000, tenía sentido que el cliente no pudiera conectarse correctamente al servidor. Para solucionar esto, agregué ProxyPass /socket.io http://localhost:3000/socket.io al archivo de configuración de Apache. Básicamente, esto solucionó el problema, ya que ahora todas las solicitudes de socket.io se enviaban al puerto adecuado.

Esto funcionó bien para mí hasta que quise configurar una segunda aplicación en un puerto diferente. El cliente para la segunda aplicación tenía la dirección http://example.com/app2 , que esta vez se ProxyPass /app2 http://localhost:3001 a un puerto en el servidor web, el puerto 3001 esta vez, utilizando ProxyPass /app2 http://localhost:3001 . Como describí anteriormente, la página en sí se cargó bien, pero la conexión socket.io no se realizó. Esta nueva página de cliente estaba enviando nuevamente todas las solicitudes de socket.io a http://example.com/socket.io . Como supondría, todo el tráfico de la página del cliente de la segunda aplicación se estaba enviando al servidor incorrecto. Cambié el puerto al que se /socket.io de 3000 a 3001 para que la segunda aplicación funcionara correctamente, pero ahora la primera tiene exactamente el mismo problema.

No importa lo que haga, no puedo conseguir que las páginas del cliente soliciten que socket.io esté debajo de la URL de la aplicación, como http://example.com/app1/socket.io . Puedo cambiar la línea de origen del script en la página del cliente a algo así como (con o sin el ‘/’ ) y todavía lo hace no trabajo. Supongo que el problema esencialmente consiste en tratar de encontrar una manera de ejecutar dos servidores node.js / socket.io completamente separados simultáneamente.

TL; DR: ¿Cómo puedo tener dos servidores socket.io ejecutándose al mismo tiempo en el mismo servidor Apache?

Como ya ha visto, por defecto, socket.io inicia todas las conexiones con la misma URL. Sus dos aplicaciones estarán, por defecto, usando exactamente la misma URL y, por lo tanto, su servidor Apache no puede decir cuál es cuál para poder establecerlas de manera diferente.

Por lo tanto, la única manera de solucionarlo es configurar una de sus instalaciones socket.io (cliente y servidor) para usar una ruta personalizada que luego puede proxypass por separado de la ruta predeterminada socket.io.

Puede configurar la ruta del servidor cuando construya el servidor como se describe aquí .

 const server = require('http').createServer(); const io = require('socket.io')(server, { path: '/myownpath' }); server.listen(3000); 

Puede establecer la ruta de solicitud del cliente al realizar la conexión en el cliente como se describe aquí .

 const socket = io('http://localhost', { path: '/myownpath' });