Controlando y monitoreando aplicaciones en NodeJS con Supervisor

Para los que no conocen, Supervisor es un sistema cliente/servidor que permite monitorear/controlar procesos y servicios en sistemas GNU/Linux. Por lo que para este post, instalaremos Supervisor en CentOS 7 o en Fedora 21 para controlar una aplicación desarrollada en NodeJS.

Supervisor:

Primero, tendremos que instalar el paquete easy_install con la que luego podremos instalar supervisor . Tambien es posible instalar supervisor usando pip:

$ sudo yum install python-setuptools -y
$ sudo easy_install supervisor

Comprobamos la versión de Supervisor que ha sido instalada en nuestro sistema:

$ supervisord -v
$ 3.1.3

Systemd:

Para controlar nuestras aplicaciones escritas en NodeJS con Supervisor, es necesario crear un servicio para Systemd. Para los que no conocen Systemd, es un gestor de sistemas y servicios para GNU/Linux compatible con los initscript de SysV y LSB. Me he tomado el tiempo y he creado un repositorio en Github con este servicio para Systemd y las respectivas configuraciónes para Supervisor. Procedemos a clonar este repositorio a nuestro directorio local de la siguiente manera:

$ git clone https://github.com/zokeber/supervisor-systemd.git ~/supervisor-systemd

Posteriormente copiamos los directorios y archivos en los directorios /etc/supervisor y /etc/systemd/system , respectivamente:

$ sudo cp -vr ~/supervisor-systemd/etc/supervisor /etc/supervisor
$ sudo cp -v ~/supervisor-systemd/etc/systemd/system/supervisord.service /etc/systemd/system/

Creamos el directorio para los logs que generará Supervisor:

$ sudo mkdir -p /var/log/supervisor

Luego, habilitamos e iniciamos el servicio para Supervisor, en la terminal ejecutamos lo siguiente:

$ sudo systemctl enable supervisord.service
$ sudo systemctl start supervisord.service
$ sudo systemctl status supervisord.service

Por ultimo, creamos un alias para supervisorctl en nuestro archivo local .bashrc o bien si utilizan Zshell, en el archivo .zshrc, agregamos lo siguiente:

alias supervisorctl="supervisorctl -c /etc/supervisor/supervisord.conf"

NodeJS:

Ahora que tenemos corriendo Supervisor con Systemd, vamos a crear un proceso para nuestras aplicaciones escritas en NodeJS. Nos trasladamos al directorio /etc/supervisor/conf.d/ y creamos el archivo con extensión .conf que contandrá los datos corrrespondientes de la aplicación en NodeJS:

$ cd /etc/supervisor/conf.d
$ sudo touch nodejsapp.conf

Dentro de este archivo al que se le ha llamado nodejsapp.conf deberá contener los siguientes datos:

[program:app_nodejs]
command=/usr/bin/node /home/$usuario/nodejsapp/server.js
directory=/home/$usuario/nodejsapp/
user=$usuario
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nodejsapp.log
redirect_stderr=true
stopsignal=QUIT

Los cambios que posteriormente tendrán que realizar con los datos de sus aplicación en NodeJS son el usuario que esta seteado como $USER , el directorio donde se encuentra la aplicación NodeJS, la ruta del directorio donde se encuentra la aplicación NodeJS, y la ruta del binario de NodeJS. Si estas usando NVM , y como lo explique en un post anterior en el que comentaba del como Instalar NodeJS desde NVM en Fedora 20 setearemos en el archivo .conf la siguiente ruta hacía el binario de NodeJS:

[program:nodejsapp]
command=/home/$USER/.nvm/v0.10.38/bin/node /home/$USER/nodejsapp/server.js
directory=/home/$usuario/nodejsapp/
user=$USER
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nodejsapp.log
redirect_stderr=true
stopsignal=QUIT

Realizado lo anterior es necesario actualizar Supervisor para que tome el nuevo proceso agregado, ejecutamos en la termimal lo siguiente:

$ sudo supervisorctl update
$ nodejsapp: added process group

La salida de anterior comando ejecutado indica que el proceso ha sido agregado a Supervisor: Podemos solo simplemente ejecutar el comando supervisorctl y con esto mostrar todos los procesos que estan siendo controlados y monitoreados por Supervisor, ejecutamos lo siguiente en la terminal:

$ sudo supervisorctl 
nodejsapp    RUNNING      pid 31822,    uptime 2:43:27
supervisor> 

La salida del comando ejecutado anteriormente muestra la información del proceso para la aplicación desarrollada con NodeJS, en ella se puede ver que se esta ejecutando y se encuentra claro esta, bajo el control de Supervisor.

Se puede encontrar mas información en los respectivos sitios web de Systemd y Supervisor.