2012-04-18 25 views
10

Mi objetivo final es hacer que node.js sea más rentable por cada instancia de servidor.¿Cómo hacer Node.js Multi-tenant para sitios web en el puerto 80?

No estoy ejecutando un juego o sala de chat, sino sitios web simples para los clientes. Me gustaría alojar a varios clientes en un único servidor, pero tengo varios sitios web que se ejecutan fuera del puerto 80 utilizando la asignación de encabezado de host. Me gustaría seguir utilizando Express como lo estoy haciendo, pero que sea más como un enrutamiento desde el puerto 80 a las aplicaciones del otro nodo, si eso es posible. El nodo puede ser más barato si se hace de esta manera, pero actualmente es más caro para mis propósitos, ya que cada cliente necesitaría su propia caja si se ejecuta en el puerto 80. Además, mi motivación es centrarme en el desarrollo de nodos, pero debe haber una razón para hacerlo entonces en términos de costo

Hago esto bastante para ASP.NET en Windows, ya que IIS soporta esto de fábrica y sé que esto también es normal para Apache.

Siéntase libre de mover esto a otro foro en el intercambio de pila si esta no es la pregunta correcta o dar una crítica constructiva en lugar de un voto negativo al azar. Gracias.

actualización

El enfoque Tomé era utilizar alojamiento estático (a través de gatspy y S3), entonces una API en lugar de que los dominios registrados a través de mensaje de envío de las claves de cliente y API del servidor y genera sitios estáticos periódicamente como los sitios cambian pero gracias por todas las sugerencias!

+1

De su pregunta, parece que ya conoce la respuesta básica: use 'req.headers.host' para decidir entre diferentes cadenas de enrutamiento para diferentes fantasmas, entonces, ¿está pidiendo una forma integrada de hacerlo? ¿O una biblioteca para abstraer los detalles? – jimw

+0

incorporado sería preferible, el nodo es genial en cuanto a que puede rodar el suyo propio, pero yo preferiría que algo se construya de forma activa por derecho propio –

+1

Hay [este] (https://github.com/coolaj86/connect-vhoster), pero no es un proyecto muy activo. De lo contrario [node-http-proxy] (https://github.com/nodejitsu/node-http-proxy), que es mucho más activo, pero tal vez mucho más de lo que necesita. – jimw

Respuesta

25

En teoría, podría construir un servidor web de nodo puro que emulara la funcionalidad de Apache/Lighttpd/Nginx, pero no lo recomendaría. De hecho, para los servicios de producción serios, recomendaría SIEMPRE afrontar su servicio con Nginx o un equivalente (vea this y this).

Así es como un simple Nginx config trabajaría para dos subservicios expuestos en el puerto 80.

worker_processes 4; 

events { 
    worker_connections 1024; 
} 

http { 
    include  mime.types; 
    default_type text/html; 

    server { 
    listen 80; 
    server_name service1.mydomain.com 
    location/{ 
     proxy_pass   http://127.0.0.1:3000/; 
    } 
    } 
    server { 
    listen 80; 
    server_name service2.mydomain.com 
    location/{ 
     proxy_pass   http://127.0.0.1:3001/; 
    } 
    } 
} 

que he visto en la producción de cajas de pánico del kernel porque el nodo no se carga por defecto del acelerador y fue dando prioridad a aceptar nuevas conexiones sobre el manejo de solicitudes existentes - concedido, "no debería" haber bloqueado el kernel, pero lo hizo. Además, al ejecutar en el puerto 3000, puede ejecutar su servicio Node como no raíz con muy pocos permisos (y todavía poderlo para que parezca estar en el puerto 80). También puedes repartir la carga entre varios trabajadores, atender estática, solicitudes de registro, reescribir URL, etc., etc. Nginx es muy rápido (mucho más ligero que Apache). La sobrecarga del reenvío de proxy de Same-Box es mínima y te compra tanta funcionalidad y solidez que es un éxito en mi libro. Incluso cosas menores, como: cuando bloqueo o sobrecarga el servicio de mi nodo, el usuario obtiene un agujero negro, o un splash de "perdón por el polvo, nuestros servidores se mantienen".

+1

Vi esta respuesta también. http://stackoverflow.com/questions/5009324/node-js-nginx-and-now Revisaré el suyo ya que estoy de acuerdo en que este es el mejor enfoque que he visto. Gracias. –

+0

Solo como una pregunta: esto no es realmente multitenancy ya que hay más de un software en ejecución pero se trata de tener varios sitios web que usan el mismo puerto en un servidor ¿verdad? – IroNEDR

5

¿Qué hay de usar un proxy inverso adecuado, como HAProxy, hacer que el proxy escuche en el puerto 80 y delegar en instancias de nodos múltiples en puertos no públicos (por ejemplo, 10000, 10001, etc.), en headers.host?

+0

sí, eso tiene sentido –

+0

El principal problema con esto es que no tendría acceso en este nivel para que HAProxy funcione. Estoy buscando una solución Node.js directamente, pero esto es útil con seguridad. Puse esto en mi mente para ideas futuras. –

+3

Personalmente, no confío en una solución de nodo solo, especialmente porque está hablando de diferentes sitios de clientes. El nodo tiene una sola hebra, lo que significa que los sitios interferirán fácilmente con el rendimiento de los demás y/o desaparecerán entre sí cuando mueran (si todos se están ejecutando en la misma instancia). ¿Cómo está actualmente implementando un nodo? – UpTheCreek

Cuestiones relacionadas