2011-12-05 34 views
74

He escrito una aplicación Node.js, estoy buscando que se ejecute en una de nuestras máquinas de producción. Esto parece una petición bastante común, pero no puedo encontrar una solución adecuada. ¿No hay soluciones establecidas para implementar aplicaciones de producción Node.js?Despliegue de un servidor Node.js de producción

La aplicación es simple (< 100 LOC), pero debe ser muy eficiente, confiable y funcionar continuamente durante años sin reiniciar. Se ejecutará en un sitio grande, con docenas de conexiones por segundo. (La aplicación no se utiliza como un servidor web, que sólo tiene una API JSON)

Estos son los enfoques que he considerado, pero todavía no estoy seguro acerca de:.

uso de un marco (por ejemplo, expreso)

Como la aplicación necesita ser de alto rendimiento y es tan simple, agregar reblandecimiento en forma de marco es algo que quiero evitar.

Inicio del servidor con nohup

El principal problema aquí es con el manejo de excepciones, que (obviamente) no queremos que todo el servidor se bloquee debido a una excepción. Por lo que entiendo, envolver toda la aplicación en un bucle try {} catch {} no ayudará porque el intérprete de Javascript se deja en un estado impredecible después de una excepción. ¿Es eso correcto?

usando algo como siempre

He instalado para siempre en una máquina FreeBSD de los nuestros y que era muy buggy. Terminó generando procesos interminables que no podían ser eliminados de Forever. Tuve que ejecutar kill -9 para recuperar mi máquina y no me siento demasiado seguro para ejecutar una aplicación de producción en Forever. También parece que Upstart (herramienta similar, pero más genérica) no se ejecutará en FreeBSD.

Las soluciones hospedadas (por ejemplo. Heroku, Rackspace, Amazon EC2, etc.)

Esta es probablemente la solución más simple, pero ya tenemos un serio el hardware para el resto de nuestros servidores web. Por consideraciones financieras, no tiene sentido.

Seguramente debe haber alguna solución establecida para esto? ¿Me estoy perdiendo de algo?

+0

advenedizo es un reemplazo para sysvinit en FreeBSD. – chovy

+3

Para la multitud de 2014 que lee este SO. 'Forever' no debe descartarse porque falló en este caso durante dos años y hace numerosos commits. He tenido éxito al ejecutarlo durante los últimos meses. –

+6

Para la multitud de 2015 que lee este SO. Solo use [PM2] (http://www.nikola-breznjak.com/blog/nodejs/using-pm2-to-run-your-node-js-apps-like-a-pro/) en lugar de Forever. – Nikola

Respuesta

38
  • Usted debe realmente utilizar un marco (recomiendo algo así como expreso desde que fue probado en combate) a menos que usted quiere tratar con sesiones, cookies, etc middleware por sí mismo. Express es muy ligero.
  • Iniciando el servidor con nohup: no debe hacer eso, simplemente comience con el comando "node" normal. También Express ajusta las rutas en un try-catch, por lo que su servidor no se bloqueará en una ruta. Sin embargo, si su servidor tiene un problema grave, no debe temer reiniciarlo (además, si tiene 2-3 procesos al menos, solo uno morirá, por lo que habrá al menos 1-2 restantes y el usuario ganó ' siento algo).
  • Para la supervisión, personalmente prefiero algo más en el nivel del sistema operativo, como Upstart y Monit.
  • Solución de alojamiento: como ya tiene sus propias cosas serias de hardware, no necesita invertir dinero en otra cosa. Simplemente use un equilibrador de carga (tal vez nginx o node-http-proxy) para proxy.
2

Puede obtener mejores respuestas en ServerFault, pero hay una descripción de one user's experience here usando supervisord. Necesitará utilizar algún tipo de vigilante de proceso para mantener vivo el proceso node, y otra recomendación común parece ser la de las conexiones de proxy inverso al proceso node de alguna manera. Probablemente votaría por nginx (de esta manera usted puede tener nginx manejar el registro, la autenticación o cualquier otra característica de HTTP de nivel superior que necesite en lugar de unirlos de algún modo al nodo), pero el artículo mencionado menciona haproxy en los comentarios aquí y allí que puede ser más ligero. Su elección de proxy inverso probablemente dependerá en gran medida de si necesita o no compatibilidad con WebSocket.

No estoy seguro de que exista más flujo de trabajo "estándar" para el nodo por el momento; no es tan maduro como algo como Rails que tiene una gran cantidad de formas de mantener una aplicación web en funcionamiento.

15

Ver Hosting Node Apps.

Este tutorial lo guiará en la configuración de un servidor que pueda alojar aplicaciones node.js para aplicaciones de JavaScript del lado del servidor. En este momento, las opciones de alojamiento de node.js se reducen a ejecutar procesos de daemon de nodos que hablan con un servidor web. La mayoría de los servidores web pueden conectar por proxy a un puerto diferente, por lo que podrá usar Apache o nginx para hacerlo.

+2

El enlace está roto. –

4

Aquí hay tres preguntas, creo.

Pregunta 0: "¿Debo usar un marco para mi aplicación de nodo?"

Pregunta 1: "¿Cómo ejecuto servidores de nodos en las máquinas de producción?"

Pregunta 2: "Cómo despliegue las aplicaciones de nodo en la producción".

Para Pregunta 1, Me gusta mucho Cluster (aunque la última versión de Node tiene algo así como, por lo que puede comprobarlo). He tenido éxito con algo como Monit/Upstart para monitorear eventos de nivel de sistema operativo y asegurarme de que sus servidores gocen de buena salud. (Esto supervisaba N clusters de servidores Ruby Thin, pero lo mismo).

Dependiendo del tráfico, es posible que desee ejecutar el clúster en varias máquinas, y luego poner un equilibrador de carga en frente de eso. Esto depende de su tráfico, de cuánto tardan las solicitudes en completarse/cuánto tiempo se bloquea el ciclo de eventos, y de cuántas instancias de procesadores/nodos se inician por máquina.

Una infraestructura proporciona un mejor manejo de errores y detecta errores que saldrían de las aplicaciones node.js normales. Si lo hace sin un marco, asegúrese de leer sobre el manejo de errores en node.js.

Para Pregunta 2, No creo que la comunidad de nodos tenga un buen estándar de implementación todavía. Podría intentar usar la herramienta Capistrano de Ruby (y aquí está a blog entry talking about deploying cluster with Capinstrano).

Lo malo de Capistrano es que hace algunas suposiciones que pueden no ser ciertas (es decir, que estás implementando un proyecto de Rails), por lo que puedes terminar peleando con el framework mucho.

Mi solución goto deployment en general es la herramienta Fabric de Python, que le ofrece herramientas de implementación y le permite hacer lo que necesita hacer.

Otra opción de implementación es "la nube", con cosas como Nodester: que se encarguen de ello.

0

Los chicos de Cloudkick escribieron una excelente solución para esto. Se llama Cast, http://cast-project.org/.

Instale cast en su servidor y en su estación de trabajo. Usted inicia el agente de reparto en el servidor y hace que su estación de trabajo firme con la instancia de lanzamiento de servidores. A continuación, puede crear "paquetes", subirlos al servidor, crear/actualizar/destruirlos, así como iniciar/detener sus instancias. Cast automáticamente reiniciará sus servicios cuando se bloqueen. También puede rastrear stdout/strerr de forma remota, así como obtener una lista de las instancias en ejecución y los números PID y administrar sus instancias/servidores desde su estación de trabajo (no se requiere SSHing). Los documentos están un poco desactualizados, pero los resultados valen la pena un poco de trabajo extra. Todas las interacciones/comandos son a través de HTTPS y una API RESTful.

Antes de esto, estaba haciendo todas las actualizaciones a mano con SCP/SSH. Tenemos supervise manteniendo las cosas. No hemos mirado atrás.

+1

¡Está muerto, Jim! El sitio web ahora está lleno de basura y Google no encuentra nada interesante para "node.js cast" – Sergey

+0

Sí, es abandono. Mantenemos una versión interna atm. El informe se puede encontrar en: https://github.com/cloudkick/cast –

Cuestiones relacionadas