Ejecutar aplicaciones de nodo con Forever

Para muchas personas, ejecutar su código en un entorno de producción es una ocurrencia tardía, y solo escribir el código es donde se encuentra el verdadero desafío. Tiempo...

Introducción

Para muchas personas, ejecutar su código en un entorno de producción es una ocurrencia tardía, y solo escribir el código es donde se encuentra el verdadero desafío. Si bien esto es mayormente cierto en mi experiencia, encontrar una forma confiable y fácil de ejecutar su aplicación puede ser bastante difícil en sí mismo.

Hay algunas cosas que debe tener en cuenta al ejecutar su(s) aplicación(es).

  • ¿Adónde irán los resultados/los registros?
  • ¿Qué sucede si la aplicación falla?
  • ¿Cómo hago un seguimiento de todos mis procesos daemon?
  • ¿Cómo proporciono configuraciones para cada proceso?

Aquí es donde el paquete Node Siempre es realmente útil. Le ayuda a manejar fácilmente todos los problemas anteriores y más, que describiré en las próximas secciones.

¿Qué es para siempre?

forever es una utilidad de línea de comandos para aplicaciones Node escrita completamente en JavaScript. Está destinado a simplificar su vida en un entorno de producción al administrar (iniciar, detener, reiniciar, etc.) los procesos de Nodo y sus configuraciones. Puede usarlo en la línea de comando o mediante programación (a través de forever-monitor) dentro de su código Node.

Puede especificar estas configuraciones a través de la línea de comando o un archivo de configuración JSON. Personalmente, prefiero el archivo JSON, ya que puede configurar varios procesos de Nodo en un solo archivo, lo que facilita el lanzamiento de todos sus procesos a la vez. De esta manera, no dudo en dividir un gran monolito en múltiples servicios independientes, ya que administrarlos será mucho más fácil gracias a utilidades como forever.

Funciona por debajo ejecutando servidor Flatiron como un proceso daemon para administrar sus otros procesos daemon, por lo que si/cuando su código falla y falla, para siempre estará allí para reinícielo automáticamente y, con suerte, evite el tiempo de inactividad para sus usuarios. Ejecutar para siempre con un servidor Flatiron es una manera fácil de mantener la utilidad en funcionamiento mientras se supervisa la entrada del usuario, y gracias al [Complemento CLI] (https://github.com/flatiron/flatiron#create-a- cli-application-with-flatironpluginsclioptions) esto fue fácil de hacer para los desarrolladores de forever. Si va a crear un programa como para siempre (es decir, un proceso daemon de ejecución prolongada que recibe comandos de usuario), le recomiendo que lo haga de esta manera. Hará las cosas mucho más fáciles.

La comunicación entre procesos ocurre a través de sockets, que es manejada por la biblioteca nssocket de alto nivel. Los archivos de socket que permiten reabrir la comunicación entre procesos residen en [forever.root]/socks. Naturalmente, los mensajes entre los procesos se serializan como JSON. Es otra biblioteca útil para consultar si alguna vez desea una comunicación de socket basada en eventos.

Debo señalar que una característica importante de forever (y otras herramientas de gestión de procesos similares) es que también puede usarlo para aplicaciones que no sean de nodo, como Python, Ruby, etc. El -c, o el indicador de comando (que verá más adelante), déjenos decirle a forever cómo ejecutar su aplicación. Usando esto, puede decirle que use cualquier otro intérprete para la ejecución, como Python:

1
$ forever start -c python py_script.py

Entonces, incluso si no le gusta Node, o simplemente necesita usar un idioma diferente para un proyecto, tenga en cuenta que esto todavía es útil para usted.

Cómo usar Forever

Ok, vamos a la parte importante, cómo usar realmente la maldita cosa. Comencemos con un ejemplo simple, como iniciar y detener una aplicación web. Para nuestro ejemplo, iniciaremos y detendremos un servidor Express "hello world":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// index.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

var server = app.listen(8080);

Instale forever con npm install forever -g e inicie el servidor con:

1
$ forever start -a index.js

Esto iniciará la aplicación Express como un proceso en segundo plano. El indicador -a agrega registros al archivo de registro predeterminado ubicado en el directorio raíz de forever\ (~/.forever por defecto en los sistemas Unix). No podrá iniciar la aplicación sin este indicador si el archivo de registro ya existe.

Inspeccione el proceso en ejecución con forever list:

1
2
3
info:    Forever processes running
data:        uid  command                                         script   forever pid   id logfile                        uptime      
data:    [0] moMB /Users/scott/.nvm/versions/node/v4.1.2/bin/node index.js 21389   21390    /Users/scott/.forever/moMB.log 0:0:0:3.345

Para detener el proceso, solo consúltelo por id (21390), uid (moMB), pid (21389), índice (0) o nombre de script (index.js):

1
$ forever stop index.js

Si bien esto es agradable, podría ser mejor. index.js no es muy exclusivo de nuestra aplicación, y el PID es difícil de recordar, entonces, ¿por qué darle un nombre mejor? De esa manera, no tiene que seguir ejecutando forever list para obtener información sobre su proceso en ejecución.

1
$ forever start -a --uid myapp index.js

Ahora puedes detenerlo con:

1
$ forever stop myapp

Dos argumentos en la línea de comando no es tan malo, pero puede volverse un poco excesivo cuando comienza a agregar argumentos para archivos de registro, diferentes ejecutables de Node, directorios de trabajo y más. Entonces, en lugar de especificar todo en la línea de comando, puede usar un archivo de configuración JSON como este:

1
2
3
4
5
6
7
8
9
{
    // Comments are allowed!
    "uid": "myapp",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/home/scott/myapp",
    "command": /Users/scott/.nvm/versions/node/v4.1.2/bin/node
}

Suponiendo que este archivo está en su directorio de trabajo actual y se llama forever.json, utilícelo así:

1
$ forever start ./forever.json

Como puede ver, incluso puede decir “para siempre” qué versión de Node usar, lo cual es realmente conveniente cuando tiene varias aplicaciones en un solo servidor que requieren diferentes versiones (como la bifurcación io.js).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[
  {
    // App using Node v0.11.8
    "uid": "myapp1",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/Users/scott/myapp1",
    "command": "/Users/scott/.nvm/versions/node/v0.11.8/bin/node"
  },
  {
    // App using io.js
    "uid": "myapp2",
    "append": true,
    "watch": true,
    "script": "index.js",
    "sourceDir": "/Users/scott/myapp2",
    "command": "/Users/scott/.nvm/versions/io.js/v2.2.1/bin/node",
    "args": ["--port", "8080"]
  }
]

Conclusión

Existen algunas herramientas para ayudarlo a ejecutar aplicaciones de Node, en particular forever y pm2. Probé ambos y pensé que forever era un poco más fácil de usar (principalmente porque es más simple y tiene menos funciones/opciones de las que preocuparse), mientras que pm2 es más potente. Si realmente se siente ambicioso, puede probar el modo de clúster o la API de pm2 para ayudar a monitorear las métricas sobre su aplicación en ejecución.

¿Qué otras configuraciones y usos interesantes tiene para las herramientas de gestión de procesos como forever? ¡Cuéntanos en los comentarios!