Aplicacion Node en producción en Ubuntu
Sumario
Crear una aplicación simple
nano heey.js
const http = require('http'); const port = 8088; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Heeeeey que pasa!\n'); }); server.listen(port, hostname, () => { console.log(`El servidor esta funcionando en: http://localhost:${port}/`); });
Coprobamos el funcionamiento
node heyy.js
El servidor esta funcionando en: http://localhost:8088/
Nota: Node bloquea la posibilidad introducir comandos para detener node, pulsamos CTRL + C
Instalar PM2
PM2 es un administrador de procesos para aplicaciones de Node.js, permite implementar daemon, que funcionaran como servicios.
sudo npm install pm2@latest -g
Ejecutar y añadir la aplicación, con la opción --name indicamos el nombre con el que se va a ejecutar.
pm2 start heyy.js --name 'prueba'
[PM2] Starting /root/hello.js in fork_mode (1 instance) [PM2] Done. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 3 │ notas │ fork │ 2 │ online │ 0% │ 56.4mb │ │ 4 │ prueba │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
Las aplicaciones que se ejecutan en PM2 se reiniciarán de forma automática si la aplicación se bloquea o se detiene, pero podemos dar un paso adicional para que se cargue en el inicio del sistema usando el subcomando startup. Este subcomando genera y configura una secuencia de comandos de inicio para iniciar PM2 y sus procesos administrados al iniciarse el servidor:
pm2 startup systemd
En la última línea del resultado obtenido se incluirá un comando que se ejecutará con privilegios de superusuario a fin de configurar PM2 para que se cargue en el inicio:
[PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u root --hp /root
Ahora guardamos la lista de procesos de PM2
pm2 save
iniciamos el servicio
sudo systemctl start pm2-root
comprobamos el estado de la unidad de sytemd
systemctl status pm2-root
Iniciar node modo producción
Para iniciar la aplicación en modo de producción, hay que ejecutar el comando "npm run start" y para crear la instancia:
pm2 start npm --name NombreAPP -- start
Comandos PM2
Detener una aplicación por el nombre o id
pm2 stop app_name_or_id
Reiniciar una aplicación
pm2 restart app_name_or_id
Listar las aplicaciones
pm2 list
Obtener información de las aplicaciones
pm2 info app_name_or_id
Borrar una aplicación
pm2 delete app_name_or_id
Monitorizar todas las aplicaciones
pm2 monit
Configurar Nginx como servidor proxy inverso
La aplicación esta en ejecución pero solo podemos acceder desde el mismo servidor, para que los usuarios accedan a ella, necesitamos configurar el servidor Web de Nginx como proxy inverso.
Editamos o creamos un archivo de configuración en /etc/nginx/sites-available/ y añadimos las siguientes lineas en el apartado de location
location / { proxy_pass http://localhost:8088; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
Con esta configuración cuando desde fuera del servidor el usuario haga un petición a prueba.enunpimpam.com por el puerto 80, sera redireccionado al 8088 y servira nustra aplicación
Comprobamos que no se ha cometido ningún error de sintaxis
sudo nginx -t
Reiniciamos nginx
/etc/init.d/nginx restart