O NodeJS é uma plataforma construída sobre o motor JavaScript do Google Chrome para facilmente construir aplicações de rede rápidas e escaláveis. NodeJS usa um modelo de I/O direcionada a evento não bloqueante que o torna leve e eficiente, ideal para aplicações em tempo real com troca intensa de dados através de dispositivos distribuídos. (NODERBR)

Quando eu comecei a trabalhar com NodeJS me deparei com um problema logo que coloquei uma aplicação de teste em meu servidor de produção (VPS). Alguns dias depois ter colocado a minha aplicação no ar, ela parou de funcionar sem motivo aparente, pouco depois descobri que o meu VPS foi reiniciado pelo provedor de hospedagem e com isso a minha aplicação em NodeJS não ia voltar on-line após a inicialização.

A fim de resolver este problema criei este script para inicializar a aplicação após o reboot.
Criei o script para ser utilizado no “/etc/init.d”, o que permitirá rc.d reiniciar a aplicação quando ocasionalmente o meu VPS for reinicializado.

Configurações

NODE_ENV – definição do ambiente, dev, prd (padrão prd)
PORT – porta em que o NodeJS ficará escutando, (padrão 3000)
CONFIG_DIR

Configurações da Aplicação

NODE_EXEC – caminho da instalação no NodeJS no VPS
APP_DIR – diretório da aplicação
NODE_APP – nome do arquivo da aplicação.
PID_DIR – caminho do diretório de PID (padrão “$APP_DIR/pid”)
PID_FILE – nome do arquivo de PID (padrão “$PID_DIR/app.pid”)
LOG_DIR – caminho para os arquivos de log (padrão to “$APP_DIR/log”)
LOG_FILE – nome do arquivo de log (padrão “$LOG_DIR/app.log”)

Executando o Script

Copie o arquivo node-startup para o seu VPS no diretório :

 /etc/init.d 

Em seguida, execute os comandos abaixo.


sudo bash -l
cp ./init.d/node-startup /etc/init.d/

Segue abaixo o arquivo completo:


#!/bin/sh
USER="root"
NODE_ENV="production"
PORT="3000"
APP_DIR="/var/www/example.com"
NODE_APP="app.js"
CONFIG_DIR="$APP_DIR"
PID_DIR="$APP_DIR/pid"
PID_FILE="$PID_DIR/app.pid"
LOG_DIR="$APP_DIR/log"
LOG_FILE="$LOG_DIR/app.log"
NODE_EXEC=$(which node)
###############
USAGE="Usage: $0 {start|stop|restart|status} [--force]"
FORCE_OP=false
pid_file_exists() {
[ -f "$PID_FILE" ]
}
get_pid() {
echo "$(cat "$PID_FILE")"
}
is_running() {
PID=$(get_pid)
! [ -z "$(ps aux | awk '{print $2}' | grep "^$PID$")" ]
}
start_it() {
mkdir -p "$PID_DIR"
chown $USER:$USER "$PID_DIR"
mkdir -p "$LOG_DIR"
chown $USER:$USER "$LOG_DIR"
echo "Starting node app ..."
echo "cd $APP_DIR && PORT=$PORT NODE_ENV=$NODE_ENV NODE_CONFIG_DIR=$CONFIG_DIR $NODE_EXEC $APP_DIR/$NODE_APP 1>$LOG_FILE 2>&1 & echo \$! > $PID_FILE" | sudo -i -u $USER
echo "Node app started with pid $(get_pid)"
}
stop_process() {
PID=$(get_pid)
echo "Killing process $PID"
kill $PID
}
remove_pid_file() {
echo "Removing pid file"
rm -f "$PID_FILE"
}
start_app() {
if pid_file_exists
then
if is_running
then
PID=$(get_pid)
echo "Node app already running with pid $PID"
exit 1
else
echo "Node app stopped, but pid file exists"
if [ $FORCE_OP = true ]
then
echo "Forcing start anyways"
remove_pid_file
start_it
fi
fi
else
start_it
fi
}
stop_app() {
if pid_file_exists
then
if is_running
then
echo "Stopping node app ..."
stop_process
remove_pid_file
echo "Node app stopped"
else
echo "Node app already stopped, but pid file exists"
if [ $FORCE_OP = true ]
then
echo "Forcing stop anyways ..."
remove_pid_file
echo "Node app stopped"
else
exit 1
fi
fi
else
echo "Node app already stopped, pid file does not exist"
exit 1
fi
}
status_app() {
if pid_file_exists
then
if is_running
then
PID=$(get_pid)
echo "Node app running with pid $PID"
else
echo "Node app stopped, but pid file exists"
fi
else
echo "Node app stopped"
fi
}
case "$2" in
--force)
FORCE_OP=true
;;
"")
;;
*)
echo $USAGE
exit 1
;;
esac
case "$1" in
start)
start_app
;;
stop)
stop_app
;;
restart)
stop_app
start_app
;;
status)
status_app
;;
*)
echo $USAGE
exit 1
;;
esac

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>