2012-02-17 13 views
44

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) solicitudes al puerto correcto/servidor Express. 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.¿Cómo debo organizar múltiples servidores Express en el mismo sistema?

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

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

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

que tendrá que ejecutar cada app.js separado con el nodo (o con forever, que actualmente estoy usando), y cada uno tendrá que utilizar un puerto diferente internamente , con redireccionamientos de aplicaciones cruzadas dirigidos al puerto de la aplicación de destino.

Entonces, ese es mi plan actual. ¿Cuáles son los problemas con esto y qué peligros debería 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?

EDIT: Yo planeo usar el tiempo WebSockets y HTTPS, y la cantidad de ancho de banda de mi programa de instalación puede soportar es de poca importancia para mí - esto es un servidor de desarrollo (al menos por ahora). Gracias a David Ellis por mencionar el tema de WebSockets.

SEGUNDA EDICION: Gracias a ambos EhevuTov y David Ellis por sus respuestas, que me ayudaron mucho. Todavía me estoy conformando con una estructura general para mi aplicación, y parece que esa pregunta se aborda en detalle por this StackOverflow question

TERCERA EDICIÓN: He venido desde que publiqué esta pregunta (aunque tengo mucho más que ir). Consulte this file in my GitHub repository, que aprovecha lo que aprendí de las respuestas a esta pregunta.

Respuesta

35

Dado que Express usa Connect, estoy bastante seguro de que puede usar el middleware de host virtual de Connect. Funciona de manera similar a otros módulos vhost en otros productos. No tengo varios dominios para poner a prueba y le mostrará el código correcto, pero yo 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 se llega a tal punto que un servidor Express no es suficiente, entonces mirar en el uso el nodoClúster de la API. Si eso tampoco es suficiente, entonces la práctica actual es poner un proxy inverso asnyc como Nginx en frente de sus servidores Express y apuntar los proxies a sus servidores Express.

+0

Gracias por el comentario. Empecé a usar vhost (con la ayuda de algunos usuarios útiles de IRC en #express) y funciona como un hechizo. También gracias por la posibilidad de pasar a Node.Cluster. – Aaron

+2

@aaron. De nada. Nos vemos en el IRC, tal vez – EhevuTov

+0

@ Aaron ¿Tiene algún código que podría compartir para mostrarnos cómo lo hace? – Matt

6

Si no necesita usar WebSockets (o cualquier característica de HTTP 1.1, realmente), you can use NginX as your proxy instead.

La ventaja es la carga total que NginX puede manejar en comparación con Nodo es mayor (básicamente está compilado y especializado para este tipo de cosas), pero pierde la capacidad de transmitir datos (enviando trozos más pequeños a la vez).

Para un sitio más pequeño, o si no está seguro de las características que necesitará en el futuro, es mejor quedarse con node-http-proxy y 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 necesitas más tarde.

+0

Planeo usar eventualmente WebSockets y HTTPS, 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 por mencionar el tema de WebSockets. Sin embargo, mi pregunta es acerca de la organización de mi sistema one step _after_ reverse proxy server - ¿cómo debo configurar y organizar Express servers para mis múltiples aplicaciones web? – Aaron

+0

Diría que Node.js es tan joven que no existe un patrón * establecido * para múltiples aplicaciones Express en el mismo servidor. Node.js comparte más en común con Tomcat/Getty y otros servidores web basados ​​en Java; una aplicación por servidor, mientras que el alojamiento de múltiples sitios web se ha hecho tradicionalmente con un único servidor web (Apache/NginX/Lighttpd/etc). Cada aplicación web Node.js debe configurarse para que no use un puerto TCP utilizado por otra aplicación web, por lo que no hay forma de "arrastrar y soltar" para configurarlo. –

+2

Para agregar eso, porque un servidor HTTP Node.js se puede configurar para escuchar en un puerto [solo para un nombre de host específico] (http://nodejs.org/docs/v0.6.10/api/http.html# server.listen), usted * podría * tener todo configurado como un proceso Node.js ejecutando múltiples servidores Express simultáneamente. Por supuesto, eso tiene poco sentido cuando estos servidores nunca tocan el código entre ellos y la sobrecarga del proceso Node.js es solo un puñado de megabytes, pero también es una "opción". –

Cuestiones relacionadas