Introduzione

Node.js è un ambiente runtime JavaScript open-source per la creazione di applicazioni server-side e di rete.

In questo tutorial vedremo come installare e configurare Applicazioni Node.js in produzione su Ubuntu 18.04 LTS utilizzando PM2. Eseguiremo un'applicazione Node.js gestita da PM2 utilizzando Nginx come reverse proxy.

Se il vostro intento è installare e configurare Node.js e PM2 su di un server in remoto continuate a leggere, altrimenti se volete installare Node.js e PM2 sul vostro computer locale saltate il primo paragrafo "Connessione al Server" e leggere il successivo.

Prerequisiti

Prima di iniziare con questa guida, dovresti avere:

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno della password per l'autenticazione.

Per connettersi al server come utente root digitare questo comando:
ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare anche il primo parametro:
ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

Siete ora connessi al vostro server, siete pronti per iniziare l'installazione di Node.js e PM2.

Installazione Node.js utilizzando una PPA

Per installare la più recente versione di Node.js aggiungere una PPA (Personal Package Archive) gestita da NodeSource.
Assicuriamoci di trovarci nella nostra home ed installiamo la PPA. Sostituire 8.x con la versione corretta.
cd ~

curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh

Dopo aver scaricato lo script, avviamolo in questo modo:
sudo bash nodesource_setup.sh

Verrà installata la PPA e sarà aggiornata la cache dei pacchetti locali. A questo punto dare il seguente comando:
sudo apt install nodejs

Per verificare la versione di nodejs appena installata:
nodejs -v

Il pacchetto nodejs conterrà anche il Package Manager NPM quindi non sarà necessario installarlo separatamente. Tuttavia consiglio di installare il pacchetto build-essential per permettere il corretto funzionamento di alcuni pacchetti di NPM.
sudo apt install build-essential

Creare un applicazione Node.js

Creare una semplice applicazione con Node.js per imparare ad utilizzare PM2.

Da terminale dare il seguente comando per creare la nostra applicazione:
cd ~
nano hello.js

All'interno del file inserire il codice seguente:

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Salvare e chiudere i file.

Questa applicazione Node.js è in ascolto sull'indirizzo specificato (localhost) e sulla porta (3000) e restituisce "Hello World!"

Per testare l'applicazione, digitare:
node hello.js

Riceverai un messaggio di output simile al seguente:

Output
Server running at http://localhost:3000/

Per fermare l'applicazione premere CTRL + C.

Per testare l'applicazione aprire un altro terminale sul server e connettersi a localhost utilizzando curl:
curl http://localhost:3000

Riceverai un messaggio di output simile al seguente:

Output
Hello World!

Installare PM2

Installare PM2, un gestore dei processi per le applicazioni Node.js. PM2 rende possibile l'esecuzione delle applicazioni in background come servizio.

Utilizzare npm per installare l'ultima versione di PM2 sul tuo server:
sudo npm install [email protected] -g

L'opzione -g permette di installare il modulo globalmente, in modo che sia disponibile per tutto il sistema.

Utilizziamo il comando pm2 start per avviare l'applicazione in background:
pm2 start hello.js

Riceverai un messaggio di output simile al seguente:

[PM2] Spawning PM2 daemon with pm2_home=/home/noviello/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/noviello/hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├──────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ hello    │ 0  │ N/A     │ fork │ 842 │ online │ 0       │ 0s     │ 0%  │ 15.5 MB   │ root │ disabled │
└──────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

PM2 assegna automaticamente un nome app (basato sul nome file) e un id PM2. PM2 conserva anche altre informazioni, come il PID del processo, il suo stato corrente e l'utilizzo della memoria.

Le applicazioni in esecuzione in PM2 verranno riavviate automaticamente se l'applicazione si arresta in modo anomalo o viene interrotta, ma è possibile eseguire un ulteriore passaggio per avviare l'applicazione all'avvio del sistema utilizzando il sottocomando di avvio. Questo sottocomando genera e configura uno script di avvio per avviare PM2 e i relativi processi gestiti sugli avvi del server:
pm2 startup systemd

L'ultima riga dell'output risultante includerà un comando da eseguire con i privilegi di superutente per impostare PM2 all'avvio all'avvio:

[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 noviello --hp /home/noviello

Esegure il comando dell'output, con il vostro nome utente al posto di noviello:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u noviello --hp /home/noviello

Come ulteriore passaggio, possiamo salvare l'elenco dei processi PM2 e gli ambienti corrispondenti:
pm2 save

Abbiamo creato un unità systemd che esegue PM2 per l'utente all'avvio del sistema. Questa unità eseguirà hello.js.

Avviare il servizio con systemctl:
sudo systemctl start pm2-noviello

Controllare lo stato dell'unità systemd:
systemctl status pm2-noviello

Per arrestare l'applicazione: (specificare il nome o l'ID dell'app PM2, nel nostro caso hello):
pm2 stop hello

Per riavviare l'applicazione:
pm2 restart hello

Per visualizzare la lista delle applicazioni gestite da PM2:
pm2 list

Per ottenere informazioni specifiche di un applicazione:
pm2 info hello

Per monitorare i processi delle applicazioni:
pm2 monit

L'esecuzione di PM2 senza argomenti mostrerà anche una pagina di aiuto con l'utilizzo di esempio.

Ora che l'applicazione Node.js è in esecuzione e gestita da PM2.

Configurare Nginx come Reverse Proxy

L'applicazione è in esecuzione e in ascolto su localhost, configureremo il server Web Nginx come proxy inverso per permettere agli utenti di accedervi.

Aprire questo file per la modifica:
sudo nano /etc/nginx/sites-available/default

All'interno del blocco del server, dovresti avere una sezione location /. Sostituire il contenuto di quella sezione con la seguente configurazione. Se l'applicazione è impostata per l'ascolto su una porta diversa, aggiornare la parte evidenziata al numero di porta corretto:

server {
...
    location / {
        proxy_pass http://localhost:3000;
        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;
    }
...
}

Salvare e chiudere il file.

Supponendo che il nostro server sia disponibile su esempio.com, l'accesso a https://esempio.com/ tramite un browser web invierebbe la richiesta a hello.js, in ascolto sulla porta 3000 su localhost.

OPZIONALE:
È possibile aggiungere ulteriori blocchi di posizione allo stesso blocco del server per fornire l'accesso ad altre applicazioni sullo stesso server. Ad esempio, se stavi eseguendo un'altra applicazione Node.js sulla porta 3001, potresti aggiungere questo blocco di posizione per consentire l'accesso ad esso tramite https://esempio.com/app2:

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        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;
    }
...
}

Assicurarsi di non aver commesso errori di sintassi:
sudo nginx -t

Riavviare Nginx:
sudo systemctl restart nginx

Supponendo che l'applicazione Node.js sia in esecuzione e che le configurazioni dell'applicazione e Nginx siano corrette, ora dovresti essere in grado di accedere alla tua applicazione. Provalo accedendo all'URL del tuo server (il suo indirizzo IP pubblico o il nome di dominio).

L'installazione e la configurazione di Node.js e PM2 per un applicazione in produzione su Ubuntu 18.04 LTS è terminata.