Installare e proteggere un server Nginx su Ubuntu

Installa Nginx su Ubuntu e configura sito, UFW, HTTPS, permessi, header, aggiornamenti e controlli senza perdere l’accesso remoto.

Installare e proteggere un server Nginx su Ubuntu

Installa Nginx su Ubuntu e configura sito, UFW, HTTPS, permessi, header, aggiornamenti e controlli senza perdere l’accesso remoto.

Requisiti e DNS

Usa Ubuntu Server aggiornato e un account sudo. Per HTTPS, example.com deve puntare all’IP pubblico; pubblica www o AAAA solo se raggiungibili. Mantieni una seconda sessione SSH e un accesso di recupero. Sostituisci sempre example.com e verifica record A/AAAA con dig.

Installazione e verifica

Installa il pacchetto Ubuntu, verifica il servizio, la sintassi e la risposta locale. Un HTTP 200 locale non prova ancora la raggiungibilità dall’esterno.

sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo systemctl enable --now nginx
sudo nginx -t
curl -I http://127.0.0.1

Firewall UFW

Prima di abilitare UFW autorizza la porta SSH effettiva: OpenSSH nell’esempio vale per la configurazione standard; se SSH usa una porta diversa, consenti NUMERO/tcp. Nginx Full apre 80 e 443 TCP. Dopo ufw enable prova una nuova sessione SSH senza chiudere quella esistente. Controlla anche firewall del provider e IPv6.

sudo ufw status verbose
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose

Directory e permessi

Il sito statico di esempio usa directory posseduta dall’utente amministratore, gruppo www-data, directory 750 e file 640. Verifica che Nginx possa attraversare ogni directory padre. I contenuti dinamici richiedono proprietà e permessi specifici; non applicare chown -R indiscriminatamente e non usare 777.

sudo install -d -o "$USER" -g www-data -m 750 /var/www/example.com/public
printf '%s
' '<!doctype html><title>Example</title><h1>It works</h1>' | tee /var/www/example.com/public/index.html >/dev/null
chmod 640 /var/www/example.com/public/index.html

Server block HTTP

Crea /etc/nginx/sites-available/example.com con la configurazione di esempio. Usa inizialmente solo example.com: aggiungi www solo se DNS e certificato lo coprono. La location per i file nascosti può interferire con /.well-known/; prima di usare Certbot verifica la challenge e lascia gestire al plugin Nginx l’eccezione necessaria, oppure inserisci una location esplicita per la challenge e prova la convalida.

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /var/www/example.com/public;
    index index.html;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    location / { try_files $uri $uri/ =404; }
    location ~ /\. { deny all; }
}

Attivazione e test

Attiva il symlink solo se non esiste, controlla nginx -t prima del reload e prova l’host localmente. Disabilita il sito default solo dopo aver verificato che non serva altri contenuti. Se nginx -t fallisce, correggi prima di ricaricare.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1

Certificato HTTPS

Segui le istruzioni Certbot correnti per Nginx. Lo Snap è un metodo supportato; usa /snap/bin/certbot esplicitamente senza creare symlink se un altro certbot è già installato. Assicurati che example.com sia raggiungibile pubblicamente sulla porta 80; l’esempio richiede un certificato solo per quel nome. Certbot può modificare il server block. Controlla redirect, certificato e rinnovo con dry-run.

sudo snap install --classic certbot
sudo /snap/bin/certbot --nginx -d example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I https://example.com
sudo /snap/bin/certbot renew --dry-run

Header e limiti

Nel blocco http o server HTTPS, server_tokens off nasconde il numero di versione ma non mette in sicurezza il server da solo. Aggiungi gli header secondo l’applicazione, ricordando che add_header può essere ridefinito nelle location. X-Frame-Options SAMEORIGIN impedisce alcuni incorporamenti. client_max_body_size 8m è solo un esempio. Imposta HSTS soltanto dopo test completi di HTTPS e sottodomini, senza preload iniziale.

server_tokens off;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header X-Frame-Options SAMEORIGIN always;
client_max_body_size 8m;

Reverse proxy opzionale

Usa questo blocco al posto della location statica, non insieme alla stessa location /. Il backend deve ascoltare su 127.0.0.1:8080 se non va esposto. Configura l’applicazione affinché si fidi degli header inoltrati solo dal proxy previsto e prova redirect, WebSocket e timeout quando necessari.

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Aggiornamenti e osservabilità

Aggiorna sistema e componenti applicativi; valuta unattended-upgrades secondo le procedure di manutenzione. Controlla log specifici, journal, spazio e nginx -t. Errori 403 possono indicare permessi o indice assente; 502 un backend non raggiungibile. Ogni reload deve seguire un test valido.

sudo tail -f /var/log/nginx/example.com.error.log
sudo journalctl -u nginx --since '1 hour ago'
df -h
sudo nginx -t

Controlli finali

Verifica SSH dopo UFW, DNS e IPv6, porte pubbliche, proprietà dei file, nginx -t, risposta HTTPS e dry-run del rinnovo. Adatta impostazioni di upload, header e proxy alla tua applicazione. Conserva backup della configurazione e monitora i servizi.

Fonti ufficiali

Nginx: https://nginx.org/en/docs/ ; Certbot: https://certbot.eff.org/instructions?ws=nginx&os=snap ; UFW: https://documentation.ubuntu.com/server/how-to/security/firewalls/ .

Share

What's Your Reaction?

Like Like 0
Cancella like Cancella like 0
Amore Amore 0
Buffo Buffo 0
arrabbiato arrabbiato 0
Sad Sad 0
Wow Wow 0