Pregunta

Estoy usando un servidor para alojar varias aplicaciones web Node.js, que se distribuyen en varios dominios. Mi práctica actual es ejecutar un servidor Express para cada aplicación en un puerto diferente y ejecutar un servidor base que simplemente enruta (redirecciona) las solicitudes al puerto / servidor Express correcto. Esto funciona, pero significa que mi servidor base está enrutando cada solicitud HTTP (y redirigiéndola manualmente), y que mis usuarios ven mis aplicaciones como alojadas en [hostname.com]: 8000.

Después de investigar un poco, descubrí que puedo usar http-proxy para mis necesidades de enrutamiento, pero aún me gustaría saber si existe una mejor práctica para ejecutar varios servidores Express en el mismo sistema. Así es como estoy planeando hacerlo:

Cada Cada aplicación web tendrá su propia carpeta, con una estructura completa de carpetas Express (app.js, rutas, vistas, etc.) Las aplicaciones se agruparán por dominio, por lo que una estructura de carpetas de ejemplo sería:

    hostname.com/
        app.js
        routes/
        views/
        ...
        app1/
            app1.js
            routes/
            views/
            ...
        app2
        ...
    hostname2.com/
        app.js
        routes/
        views/
        ...

Tendré que ejecutar cada app.js por separado con node (o con para siempre , que Que estoy usando actualmente), y cada uno tendrá que usar un puerto diferente internamente, con redireccionamientos de aplicaciones cruzadas apuntando al puerto de la aplicación de destino.

Por lo tanto, ese es mi plan actual. ¿Cuáles son los problemas con él y qué trampas debo tratar de evitar? Lo más importante es que ¿existe una solución establecida para este problema, el problema de alojar múltiples aplicaciones web en el mismo sistema con Node.js / Express?

EDITAR: planeo usar WebSockets y HTTPS eventualmente, y la cantidad de ancho de banda que mi configuración puede admitir es de poca importancia para mí: este es un servidor de desarrollo (al menos por ahora). Gracias a David Ellis por mencionar el problema de WebSockets.

SEGUNDA EDICIÓN: Gracias tanto a EhevuTov como a David Ellis por sus respuestas, las cuales ayudaron mucho. Todavía me estoy decidiendo por una estructura general para mi aplicación, y parece que esa pregunta la aborda con cierto detalle esta pregunta de StackOverflow

57 TERCERA EDICIÓN: He avanzado mucho desde que publiqué esta pregunta (aunque tengo mucho más por hacer). Consulte este archivo en mi repositorio de GitHub , que aprovecha lo ¡Aprendí de las respuestas a esta pregunta!

¿Fue útil?

Solución

Dado que Express usa Connect , estoy bastante seguro de que puede usar el middleware de host virtual de Connect.Funciona de forma similar a otros módulos vhost en otros productos.No tengo varios dominios para probar y mostrarte el código correcto, pero creo que es algo como esto:

express.createServer()
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)

Si llega al punto en el que un servidor Express no es suficiente, busque el uso de Node.Cluster de la API.Si eso tampoco es suficiente, entonces la práctica actual es colocar un proxy inverso asnyc como Nginx frente a sus servidores Express y apuntar los proxies a sus servidores Express.

Otros consejos

Si no necesita utilizar WebSockets (o cualquier función HTTP 1.1, en realidad), puede usar NginX como su proxy en su lugar .

La ventaja es que la carga total que NginX puede manejar frente a Node es mayor (está compilado estáticamente y se especializa para este tipo de cosas, básicamente), pero pierde la capacidad de transmitir cualquier dato (enviando fragmentos más pequeños a la vez).

Para un sitio más pequeño, o si no está seguro de las funciones que necesitará en el futuro, probablemente sea mejor seguir con node-http-proxy y solo cambiar a NginX si puede demostrar que el proxy es el cuello de botella en su servidor.Afortunadamente, NginX no es difícil de configurar si lo necesita más adelante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top