Volvemos con una pregunta interesante ¿Como desplegamos nuestra aplicación nodejs como un servicio en nuestra máquina de producción? El proyecto en el que estoy trabajando es un requisito que el servidor de nodejs arranque con el sistema empezando a leer los sensores proporcionando la información a la aplicación cliente que se conecte al websocket que abre el servidor. El objetivo es que no deban de arrancar el servicio y que este se levante automáticamente solo en caso de caerse por algún tipo de error.
En Linux existen distintas vertientes y estrategias de arranques de los servicios, pero hoy voy a hablar de Upstart, que es una estrategia basada en eventos para el demonio init, el cual es el encargado de arrancar todos los servicios necesarios para el funcionamiento del sistema operativo. Upstart se encarga de lanzar todas las tareas necesarias para el arranque del sistema por lo que podemos engancharnos a él pudiendo crear nuestras propias tareas, de tal manera arrancar nuestro servicio al arranque del sistema.
Configurando nuestro servicio nodejs
Para hacer que nuestro server se comporte como un servicio del sistema y podamos arrancarlo, pararlo, reiniciarlo, ver su estado, acceder a su log debemos de definir este servicio con Upstart implementando un script que incluiremos en /etc/init. El fichero debe de tener una extensión .conf , por ejemplo miapp.conf. A continuación os dejo un script de prueba como ejemplo de configuración de este un servicio nodejs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
description "daemon for my node app" author "me" env LOG_FILE= /var/log/node/miapp.log env APP_DIR= /var/node/miapp env APP= server.js env PID_NAME= miapp.pid env USER= root env GROUP= www-data env POST_START_MESSAGE_TO_LOG="miapp ha sido iniciada." env NODE_BIN= /usr/bin/node env PID_PATH=/var/opt/node/run env SERVER_ENV="prod" # Arranca cuando el sistema esta cargado start on runlevel [2345] # Se detiene cuando el sistema se apague stop on runlevel [016] #Levanta el proceso automáticamente si se muere respawn # Limitamos el "respawn" a xveces con un timeout T de 5s para que no intente levantar el proceso infinitamente. respawn limit X T pre-start script echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> $LOG_FILE mkdir -p $PID_PATH mkdir -p /var/log/node end script pre-stop script rm /var/run/yourprogram.pid echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> $LOG_FILE end script script export NODE_ENV=$SERVER_ENV exec start-stop-daemon --start --chuid $USER:$GROUP</span> --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE2>&1 end script |
Puedes ejecutar el servicio en cualquier momento con: sudo service start miservice. Automaticamente arrancara el servicio y podrás ver la salida del log en el directorio configurado y nuestro servidor nodejs corriendo.