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 -i
e 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);