Node.js: configurare un'app con nginx e Let's Encrypt

Node.js: configurare un'app con nginx e Let's Encrypt

In questo articolo vedremo come configurare un app in Node.js con nginx e Let's Encrypt.

Per prima cosa creiamo un nuovo utente e la document root per il sito e per l'app in Node:


sudo -i # Diventiamo root
adduser myapp
su - myapp
mkdir app www
exit

Creiamo un nuovo set di regole per nginx dopo aver acquisito privilegi di root (sudo -ie quindi nano /etc/nginx/sites-available/myapp):

upstream myapp {
 server 127.0.0.1:3000;
 }
server {
listen 80;

server_name myapp.com;

root /home/myapp/www;
index index.html;

client_max_body_size 8m;

location / {
  try_files $uri @myapp;
}

location @wcnode {
  proxy_pass https://myapp;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";                                                                                                                                                          
}
}

A questo punto abilitiamo il nuovo set di regole:

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp

Se non avete già installato il tool di Let's Encrypt potete farlo come segue: per prima cosa aggiungete la repository:

add-apt-repository ppa:certbot/certbot

Quindi aggiornate l'elenco dei pacchetti:

apt-get update

Infine installate Certbot:

apt-get install python-certbot-nginx

Prima di riavviare nginx, otteniamo un certificato SSL da Let's Encrypt:

certbot --nginx -d myapp.com

Scegliamo l'opzione 2 durante l'installazione in modo da avere il redirect SSL inserito nel nostro set di regole.

A questo punto copiamo i file del certificato nella directory della nostra app:

cp /etc/letsencrypt/live/myapp.com/fullchain.pem > /home/myapp/app/fullchain.pem && chown myapp:myapp /home/myapp/app/fullchain.pem

cp /etc/letsencrypt/live/myapp.com/privkey.pem > /home/myapp/app/privkey.pem && chown myapp:myapp /home/myapp/app/privkey.pem

Ora dobbiamo creare un nuovo servizio per systemd in modo che l'applicazione sopravviva e sia live al reboot. Digitiamo nano /etc/systemd/system/myapp.service e inseriamo i seguenti contenuti:

[Service]                                                                                                                                                                                           
    WorkingDirectory=/home/myapp/app                                                                                                                                                         
    ExecStart=/usr/local/bin/node app.js                                                                                                                                                                
    Restart=always                                                                                                                                                                                      
    StandardOutput=syslog                                                                                                                                                                               
    StandardError=syslog                                                                                                                                                                                
    SyslogIdentifier=myapp                                                                                                                                                                             
    User=myapp                                                                                                                                                                              
    Group=myapp                                                                                                                                                                            
    Environment=NODE_ENV=production                                                                                                                                                                     

    [Install]                                                                                                                                                                                           
    WantedBy=multi-user.target

A questo punto abilitiamo il servizio:

systemctl enable myapp

E lo avviamo:

systemctl start myapp

Solo ora testiamo la configurazione di nginx:

nginx -t

Se è tutto corretto, lo riavviamo:

systemctl restart nginx

Il codice dell'app

Lo scheletro della nostra app è il seguente:

'use strict';

const express = require('express');
const fs = require('fs');
const https = require('https');
const port = process.env.PORT || 3000;
const app = express();
const sslOptions = {
  key: fs.readFileSync('privkey.pem'),
  cert: fs.readFileSync('fullchain.pem')
 };

 app.disable('x-powered-by');


 // Qui le route


 https.createServer(sslOptions, app).listen(port);
Torna su