Ejecute múltiples servidores en el mismo puerto

19

Me gustaría ejecutar un servidor XAMPP y un servidor Nodejs en el puerto 80.

Si el servidor recibe una solicitud HTTP, XAMPP la manejará, si el servidor recibe una solicitud Websocket, entonces Nodejs

¿Como es posible? Si un puerto ya está en uso, entonces no puedo iniciar el otro programa del servidor.

iter-ator
fuente

Respuestas:

45

Debería usar un proxy inverso para hacer esto, por ejemplo, Apache 2.4. con mod_proxy_wstunnel .

Úselo como una interfaz y luego haga un túnel de las conexiones al backend apropiado.

Sven
fuente
22

Solo un único proceso puede escuchar en un puerto particular la misma dirección IP y protocolo, porque de lo contrario el sistema operativo no sabría a qué proceso enviar el paquete recibido.

Para lograr lo que desea, deberá usar un proxy inverso que escuchará en el puerto 80 y reenviará el tráfico al destino correcto. Hay varias formas de hacer esto. Por ejemplo, puede configurar su servidor web (Apache) para reenviar las solicitudes de WebSocket o puede configurar Node.js para reenviar el tráfico HTTP. Investigue las opciones disponibles y elija la que mejor se adapte a sus necesidades.

grekasius
fuente
3

Además de la opción de proxy inverso que otros ya han mencionado, podría tener varias direcciones IP asignadas a la máquina. Esto puede costar para IPv4 (o simplemente no estará disponible dependiendo de dónde esté alojado su servidor), pero no debería hacerlo si está en condiciones de usar IPv6 (es decir, si las personas que se conectan a uno o ambos o sus servicios serán compatibles con IPv6) . De esta manera, ambos servicios pueden escuchar en el puerto 80 en diferentes direcciones.

Como solo menciona el puerto 80, supongo que no está utilizando HTTPS. Si está utilizando la opción de proxy inverso, debe tener un certificado SSL de varios nombres o configurar SNI y vivir con el hecho de que algunos clientes antiguos (IE en XP, versiones antiguas de Android) no podrán conectarse sin errores La opción de direcciones múltiples evita este problema a expensas de necesitar las direcciones adicionales asignadas.

David Spillett
fuente
Solo un pequeño punto: si ya está utilizando NAT para traducir la IP, también puede hacer la redirección de puertos allí. Por ejemplo, si está ejecutando un servidor Apache con acceso a Internet y desea usar XAMPP para realizar pruebas, ejecute Apache en un puerto no estándar y haga que el puerto externo NAT del enrutador 80 solicite al puerto no estándar de la IP interna. Esto permitiría ejecutar XAMPP en el puerto 80.
Calrion