
Reverse Proxy con Nginx - Puntata 6
Ben tornati nella nostra serie. Dopo aver messo in sicurezza l'accesso SSH, oggi impariamo a configurare Nginx come reverse proxy per esporre in modo sicuro i nostri servizi web.
Obiettivo della puntata: Configurare Nginx come reverse proxy per esporre servizi web interni in modo sicuro, gestire certificati SSL e organizzare l'accesso a più servizi sotto un unico dominio.
1. Cos'è un reverse proxy e perché è importante
Un reverse proxy è un server che si frappone tra i client e i server interni, offrendo numerosi vantaggi:
Sicurezza: Nasconde l'infrastruttura interna
SSL Termination: Gestisce la cifratura SSL una volta sola
Compressione: Comprime i dati per velocizzare il trasferimento
Load Balancing: Distribuisce il carico tra più server
Flessibilità: Permette di esporre servizi su porte diverse tramite un unico punto di ingresso
2. Installazione di Nginx
Iniziamo installando Nginx sul nostro server Debian:
Aggiornare la lista dei pacchetti:
sudo apt update
Installare Nginx:
sudo apt install nginx
Verificare che Nginx sia attivo:
sudo systemctl status nginx
Se necessario, abilitare Nginx al boot:
sudo systemctl enable nginx
Aprire la porta HTTP (80) e HTTPS (443) sul firewall:
sudo ufw allow 'Nginx Full'
3. Configurazione base di Nginx
La configurazione di Nginx si trova in /etc/nginx/
. I file di configurazione dei siti sono in /etc/nginx/sites-available/
e si abilitano creando un link simbolico in /etc/nginx/sites-enabled/
.
Struttura di base di un file di configurazione:
server { listen 80; server_name tuodominio.com www.tuodominio.com; # Cartella dove verranno serviti i file statici root /var/www/tuodominio.com/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } }
4. Configurare Nginx come reverse proxy
Supponiamo di avere un servizio web interno in ascolto sulla porta 8080. Ecco come esporlo tramite Nginx:
server { listen 80; server_name tuodominio.com www.tuodominio.com; location / { # Impostare l'IP e la porta del servizio interno proxy_pass http://localhost:8080; # Headers importanti per il corretto funzionamento 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; # Timeout proxy_connect_timeout 30; proxy_send_timeout 30; proxy_read_timeout 30; } }
5. Configurazione di Let's Encrypt per HTTPS
Ora aggiungiamo il supporto HTTPS gratuito con Let's Encrypt:
Installare Certbot e il plugin per Nginx:
sudo apt install certbot python3-certbot-nginx
Ottenere un certificato SSL (sostituire con il vostro dominio):
sudo certbot --nginx -d tuodominio.com -d www.tuodominio.com
Verificare il rinnovo automatico:
sudo certbot renew --dry-run
6. Configurazione avanzata del reverse proxy
Ecco una configurazione più avanzata e sicura per il nostro reverse proxy:
server { listen 80; server_name tuodominio.com www.tuodominio.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name tuodominio.com www.tuodominio.com; # Path ai certificati SSL (generati da Certbot) ssl_certificate /etc/letsencrypt/live/tuodominio.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tuodominio.com/privkey.pem; # Configurazione SSL avanzata ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (HTTP Strict Transport Security) add_header Strict-Transport-Security "max-age=63072000" always; location / { proxy_pass http://localhost:8080; 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; # Timeout proxy_connect_timeout 30; proxy_send_timeout 30; proxy_read_timeout 30; } # Bloccare l'accesso a file nascosti location ~ /\. { deny all; access_log off; log_not_found off; } }
7. Gestire più servizi con un unico server
Se abbiamo più servizi, possiamo esporli tramite path diversi:
server { listen 443 ssl; server_name tuodominio.com; # ... configurazione SSL ... # Servizio principale location / { proxy_pass http://localhost:8080; # ... altre impostazioni proxy ... } # Altro servizio su un path specifico location /servizio2/ { proxy_pass http://localhost:8081/; # ... altre impostazioni proxy ... } # API interna location /api/ { proxy_pass http://localhost:3000/; # ... altre impostazioni proxy ... } }
8. Test e troubleshooting
Dopo aver configurato Nginx, è importante testare e verificare il tutto:
Verificare la sintassi del file di configurazione:
sudo nginx -t
Ricaricare la configurazione di Nginx:
sudo systemctl reload nginx
Controllare i log di Nginx per errori:
sudo tail -f /var/log/nginx/error.log
Verificare che i servizi siano raggiungibili:
curl -I https://tuodominio.com
Consiglio: Utilizzare SSL Labs per testare la configurazione SSL del vostro server.
9. Ottimizzazioni prestazionali
Alcune ottimizzazioni per migliorare le prestazioni di Nginx:
# Aumentare il numero di worker processes worker_processes auto; # Ottimizzazioni per SSL ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Compressione Gzip gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
Prepariamoci per la prossima puntata
Ora abbiamo un reverse proxy funzionante che ci permette di esporre servizi in modo sicuro. Nel prossimo articolo installeremo Nextcloud, la soluzione completa per il cloud privato:
Installazione e configurazione di Nextcloud
Integrazione con il reverse proxy Nginx
Configurazione del database
Ottimizzazioni per Nextcloud
Problemi con Nginx?
Lascia un commento qui sotto con le tue difficoltà, ti aiuterò a risolverle!
Prossima puntata: Nextcloud - Il cuore del nostro cloud privato
Non dimenticare di iscriverti alla newsletter per non perdere le prossime puntate!