Utilizzare pm2 per mantenere sempre attivo un server nodejs

PM2 è un gestore di processi avanzato per applicazioni NodeJS.

Pubblicato da ,
Ultima modifica

In questo articolo vedremo come creare un server con nodejs su un sistema Linux e mantenerlo sempre attivo, inoltre si suppone che si abbia già installato Apache ( o Nginx ) e nodejs.

Se nodejs non è installato sul nostro sistema Linux, possiamo farlo da CLI col seguente comando

$ apt install nodejs

se l'installazione è andata a buon fine possiamo usare il comando node, ad esempio con node -v visualizzeremo la versione che è stata installata

$ node -v
v10.13.0

Come esempio per questo articolo ho creato un VirtualHost che punta nella cartella

/var/www/mydomain.com/html/

all'interno di questa cartella creiamo un file app.js, nel quale creiamo un server con nodejs sulla porta 3000, per creare ed editare il file app.js da CLI si può usare il comando

$ vim /var/www/mydomain.com/html/app.js

editiamo questo file col seguente codice

app.js

var http = require('http');

http.createServer(function(req, res){

  res.writeHead(200, {"Content-Type":"text/html"});
  res.end("Hello World");

}).listen(3000);

avviamo il server in background col comando

$ node /var/www/mydomain.com/html/app.js &

per verificare se nodejs è attivo sulla porta 3000 usiamo il comando netstat

$ netstat -tuanp | grep LIST
.................
.................
tcp6  0  0  :::3000  :::*  LISTEN  4046/node
.................
.................

quindi possiamo testarlo con curl lanciando il comando da CLI

$ curl http://localhost:3000
Hello Horld

Adesso dobbiamo fare in modo che il server creato in app.js rimanga sempre attivo e che in caso di errori il processo venga riavviato in automatico.

Prima però eliminiamo il processo che abbiamo avviato prima in background tramite il seguente comando

$ kill -9 4046

4046 è l'id del processo che abbiamo visto prima tramite il comando netstat.

Per rendere sempre attivo il server nodejs installiamo pm2 che è un gestore di processi avanzato per applicazioni nodejs, per installare pm2 si usa il comando npm, se questo comando non è disponibile sul nostro sistema Linux possiamo installarlo tramite CLI

$ apt install npm

e poi installiamo pm2 a livello globale col comando

$ npm install pm2 -g

quindi avviamo il server nodejs usando pm2

$ pm2 start /var/www/mydomain.com/html/app.js

visualizzeremo una schermata simile a questa

pm2 start app.js

per visualizzare i dettagli del nostro processo si usa il comando pm2 show <ids>, dove ids è l'id del processo, nel nostro caso è 0

$ pm2 show 0

per rendere sempre attivo il nostro processo si usa il parametro startup, questo comando va lanciato tramite l'utente root

$ pm2 startup systemd

salviamo lo stato della nostra applicazione col parametro save

$ pm2 save

adesso avremo il server nodejs sempre attivo sulla porta 3000 e in caso di errori verrà riavviato in automatico.

Una cosa che spesso si fa quando si usa un'applicazione nodejs che espone una determinata porta, è nasconderla dietro Apache ( o Nginx ), per questo è possibile usare una regola ProxyPass nella configuazione del VirtualHost, che si troverà nella cartella apache2 se stiamo usando Apache

/etc/apache2/sites-available/mydomain.com.conf

mydomain.com.conf

<VirtualHost *:80>

  ServerName www.mydomain.com
  DocumentRoot /var/www/mydomain.com/html/

  ProxyPreserveHost On

  ProxyPass /nodejsapp http://localhost:3000
  ProxyPassReverse /nodejsapp http://localhost:3000

</VirtualHost>

in questo modo la nostra applicazione nodejs risponderà all'indirizzo /nodejsapp.

Nota*

Prima di creare una regola di ProxyPass come visto sopra, assicurarsi che i moduli mod_proxy, mod_proxy_http, mod_proxy_balancer e mod_lbmethod_byrequests siano abilitati, in caso contrario usare i seguenti comandi da CLI per abilitarli

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2enmod proxy_balancer
$ sudo a2enmod lbmethod_byrequests

e successivamente riavviare Apache col seguente comando

$ sudo systemctl restart apache2