La implementación de una producción Node.js servidor

He escrito un Node.js app, estoy mirando para conseguir que se ejecute en una de nuestras máquinas de producción. Esto parece bastante común de la solicitud, sin embargo no soy capaz de encontrar una solución adecuada. No se ha establecido de soluciones para la implementación de la producción Node.js apps?

La aplicación es simple (<100 LOC), pero tiene que ser muy eficiente, confiable y podría funcionar continuamente durante años sin necesidad de reiniciar. Va a ser ejecutado en un sitio grande, con decenas de conexiones por segundo. (la aplicación no se utiliza como un servidor web, sólo tiene un API JSON)

Aquí están los enfoques que he considerado, pero todavía no estoy seguro acerca de:

Usando un marco de trabajo (por ejemplo. Express)

Debido a que la aplicación necesita ser de alto rendimiento y es tan simple, la adición de la hinchazón en la forma de un marco es algo que quiero evitar.

De iniciar el servidor con nohup

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

El uso de algo como Siempre

He instalado para Siempre en una máquina FreeBSD de la nuestra y fue muy buggy. Terminó de desove sinfín de procesos que no podía ser asesinados desde Siempre. Tuve que correr kill -9 para obtener mi máquina y no me siento muy seguro acerca de la ejecución de una aplicación para producción por Siempre. También parece que Upstart (herramienta similar, pero más genérico) no se ejecutan en FreeBSD.

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

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

Seguramente debe haber alguna establecido solución a esto? Me estoy perdiendo algo?

  • upstart es un reemplazo para sysvinit en freebsd.
  • Para el 2014 multitud de leer este MODO. Forever no debe ser descartado debido a que no pudo, en este caso de más de dos años y numerosas comete atrás. He tenido éxito funcionando durante los últimos meses.
  • Para el 2015 multitud de leer este MODO. Sólo el uso de PM2 en lugar de para Siempre.

6 Kommentare

  1. 40
    • Usted debe realmente utilizar un framework (recomiendo algo como Express, ya que fue probado) a menos que usted quiere tratar con las sesiones, cookies, middleware, etc por ti mismo. Express es realmente la luz.
    • De iniciar el servidor con nohup: no deberías hacer eso, sólo tienes que iniciar con el habitual «nodo» de comandos. También Expreso las envolturas de las rutas en un try-catch, por lo que su servidor no se cuelgue en una ruta. Sin embargo, si el servidor tiene un problema serio, no debería temer reiniciar (además, si usted tiene 2-3 procesos de, al menos, sólo se va a morir, por lo que habrá al menos 1-2 restante y el usuario no sentir nada).
    • Para supervisar personalmente prefiero algo más en el nivel de SO, tales como Upstart y Monit.
    • Solución de alojamiento: ya que usted ya tiene su propio hardware serio cosas, sin necesidad de invertir dinero en algo más. Sólo tiene que utilizar un equilibrador de carga (tal vez nginx o nodo-http-proxy) para proxy cosas.
  2. 15

    Ver Hosting Nodo Aplicaciones.

    Este tutorial le guiará a través de la configuración de un servidor que puede alojar node.js apps de lado del servidor de aplicaciones JavaScript. Ahora, el node.js hosting opciones se reducen a la ejecución de nodo demonio de los procesos que hablar a un servidor web. La mayoría de los servidores web pueden proxy conexiones a un puerto diferente, así que usted será capaz de utilizar Apache o nginx para ello.

    • El enlace está roto.
  3. 5

    Hay tres preguntas aquí, creo.

    Pregunta 0: «debo utilizar un framework para mi nodo de la aplicación?»

    Pregunta 1: «¿Cómo puedo ejecutar el nodo servidores en máquinas de producción?»

    Pregunta 2: «¿Cómo se implementa el nodo aplicaciones a la producción».

    Para Pregunta 1, me gusta mucho Clúster (aunque la última versión de Nodo tiene algo así como que incorporado, así que usted puede comprobar que fuera). He tenido buen éxito con algo como Monit/Upstart para monitorear el nivel de SO eventos y asegurarse de que sus servidores están en buen estado de salud. (Este fue el monitoreo N grupos de Rubí Delgado servidores, pero de la misma cosa).

    Dependiendo del tráfico puede que desee ejecutar de cluster server en varios equipos, y luego poner un equilibrador de carga en frente de eso. Esto depende de su tráfico, ¿cuánto tiempo solicitudes para completar /¿cuánto tiempo se bloquea el bucle de eventos, y cómo muchos procesadores/nodo instancias de lanzamiento por la máquina.

    Un marco que le permite un mejor manejo de errores, y las capturas de errores que salga normal node.js apps. Si lo haces sin un marco de referencia, asegúrese de leer sobre el manejo de errores en node.js.

    Para Pregunta 2, no creo que el nodo de la comunidad tiene una buena implementar estándar todavía. Usted podría tratar de usar Ruby Capistrano herramienta (y aquí una entrada en el blog hablando acerca de la implementación de clúster con Capinstrano).

    Lo malo de Capistrano es que hace algunos supuestos que podrían no ser cierto (es decir: que va a implementar un proyecto Rails), por lo que puede terminar peleando con el marco mucho.

    Mi goto solución de implementación en general es el de Python Tela herramienta, que le da las herramientas de implementación y te permite hacer lo que usted necesita hacer.

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

  4. 2

    Podría obtener mejores respuestas sobre ServerFault, pero hay una descripción de una experiencia de usuario aquí utilizando supervisord. Vas a tener que usar algún tipo de proceso de observador para mantener la node proceso vivo, y otra recomendación común parece ser a la inversa de las conexiones de proxy para el node proceso de alguna manera. Probablemente me voto para nginx (de esta manera usted puede tener nginx manejar el registro, autenticación, o cualquier otro de nivel superior HTTP características que usted necesita en oposición a alguna forma de hornearlas en el nodo), pero el citado artículo menciona haproxy en los comentarios de aquí y de allí, la cual puede ser más ligero. Su elección de proxy inverso probablemente dependen en gran medida de si o no usted necesita WebSocket apoyo.

    No estoy seguro de que más «estándar» de flujo de trabajo existe para el nodo todavía; no es tan maduro como algo parecido a Rails que cuenta con una gran variedad de formas para mantener una webapp en ejecución.

  5. 0

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

    Instalar yeso en su servidor y en su estación de trabajo. Iniciar el colado del agente en el servidor y tener su estación de trabajo de firmar con los servidores de fundición de instancia. A continuación, puede crear «paquetes», subirlos al servidor, crear/actualizar/destrucción de los mismos así como iniciar/detener el sus instancias. Cast se reiniciará automáticamente sus servicios cuando se estrellan. Usted puede también a la cola de las stdout/strerr de manera remota, así como obtener una lista de las instancias de ejecución y PID#s y gestionar sus instancias y/o los servidores de su estación de trabajo (no SSHing necesario). Los documentos son un poco fuera de fecha, pero el resultado vale la pena el poco de trabajo extra. Todas las interacciones/comandos a través de HTTPS y una API RESTful.

    Antes de esto yo estaba haciendo todas las actualizaciones a mano con SCP/SSH. Nos ha supervise mantener las cosas. No hemos mirado atrás.

    • Está muerto, Jim! El sitio web está ahora lleno de seo-basura de Google y no encontrar nada interesante para «node.js cast»
    • Sí, es abandonar. Mantenemos una in-versión de la cámara de un cajero automático. El repo se puede encontrar donde: github.com/cloudkick/cast

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea