Networking

Nginx Reverse Proxy Sicuro: Configurazione HTTPS, Header e Rate Limiting (2026)

Nginx Reverse Proxy Sicuro: Configurazione HTTPS, Header e Rate Limiting (2026)

L’esposizione di servizi web e API al pubblico comporta rischi significativi. Senza una protezione adeguata, anche un’applicazione robusta può soccombere sotto il peso di attacchi DDoS o abusi intenzionali. Ricordo un episodio in cui, dopo il lancio di un’API pubblica cruciale, il backend è andato in ginocchio in meno di 48 ore. 2 milioni di richieste da soli 3 IP avevano saturato le risorse. La soluzione? Un Nginx configurato rapidamente come reverse proxy, con rate limiting, ha bloccato il traffico malevolo e ripristinato la stabilità. Questo evento ha sottolineato l’importanza critica di un reverse proxy ben configurato come prima linea di difesa. In questa guida, esploreremo come configurare Nginx per agire non solo come un efficiente reverse proxy, ma anche come un robusto guardiano di sicurezza, implementando HTTPS, security headers avanzati e rate limiting, essenziali per qualsiasi ambiente di produzione nel 2026.

Prerequisiti / Ambiente di test

Per seguire questa guida, avrai bisogno di un server Linux (preferibilmente Ubuntu Server 24.04 LTS o CentOS Stream 9) con accesso root o privilegi sudo. Assicurati che Nginx sia installato. Se non lo è, puoi installarlo con sudo apt update && sudo apt install nginx su Ubuntu o sudo dnf install nginx su CentOS. Avrai bisogno anche di un dominio registrato e puntato al tuo server per la configurazione HTTPS con Let’s Encrypt. L’ambiente di test prevede un semplice backend HTTP (ad esempio, un’applicazione Node.js o Python che risponde su una porta specifica, come 8080) per testare il proxying.

Perché un reverse proxy: sicurezza, caching, bilanciamento

Un reverse proxy è un server che si trova tra i client e i server backend. Invece di far comunicare direttamente i client con il tuo server applicativo, tutte le richieste passano attraverso il reverse proxy. Questo approccio offre numerosi vantaggi che vanno ben oltre la semplice instradamento del traffico.

Dal punto di vista della sicurezza, il reverse proxy agisce come un firewall a livello applicativo, nascondendo l’architettura interna della rete, filtrando il traffico malevolo e gestendo la terminazione SSL/TLS. Secondo un report di Cloudflare del 2025, il 68% degli attacchi DDoS a livello applicativo è stato mitigato efficacemente da servizi di reverse proxy o WAF. Offre anche una superficie di attacco ridotta, poiché solo il reverse proxy è esposto direttamente a Internet.

Per le performance, un reverse proxy può implementare meccanismi di caching per le risposte statiche o dinamiche, riducendo il carico sui server backend e migliorando i tempi di risposta per gli utenti. Inoltre, è fondamentale per il bilanciamento del carico (load balancing), distribuendo le richieste tra più server applicativi per garantire alta disponibilità e scalabilità, prevenendo che un singolo server diventi un bottleneck. Questo è cruciale in ambienti che gestiscono migliaia di richieste al secondo.

Nginx come reverse proxy: blocco server base

Nginx è un’ottima scelta per un reverse proxy grazie alla sua architettura event-driven e alla sua capacità di gestire un elevato numero di connessioni concorrenti con un basso consumo di risorse. La configurazione base è sorprendentemente semplice. Creeremo un file di configurazione per il nostro dominio (es. /etc/nginx/sites-available/tuodominio.conf) e lo abiliteremo creando un symlink in /etc/nginx/sites-enabled/.

Ecco un blocco server Nginx che instrada il traffico HTTPS sulla porta 443 a un backend HTTP in ascolto sulla porta 8080:

# /etc/nginx/sites-available/tuodominio.conf

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name tuodominio.com www.tuodominio.com;

    # Certificati SSL/TLS (saranno generati da Certbot)
    ssl_certificate /etc/letsencrypt/live/tuodominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tuodominio.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/tuodominio.com/chain.pem;

    # Parametri SSL/TLS di sicurezza
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    location / {
        proxy_pass http://backend:8080; # Sostituisci 'backend' con l'IP/hostname del tuo server applicativo
        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;

        # Impostazioni per il buffering e timeout (vedi sezione dedicata)
        proxy_buffering on;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_read_timeout 90s;
        proxy_send_timeout 90s;
        proxy_connect_timeout 90s;
    }
}

Abilita la configurazione e riavvia Nginx:

sudo ln -s /etc/nginx/sites-available/tuodominio.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

HTTPS con Let’s Encrypt e Certbot (auto-rinnovo)

La crittografia del traffico è fondamentale. Let’s Encrypt offre certificati SSL/TLS gratuiti e riconosciuti, mentre Certbot automatizza la generazione e il rinnovo. Questo garantisce che il traffico tra il client e Nginx sia sempre protetto.

Installa Certbot e il plugin Nginx:

sudo apt install certbot python3-certbot-nginx # Per Ubuntu/Debian
# sudo dnf install certbot python3-certbot-nginx # Per CentOS/RHEL

Genera il certificato per il tuo dominio. Certbot modificherà automaticamente la tua configurazione Nginx per includere i certificati e la redirezione HTTP su HTTPS:

sudo certbot --nginx -d tuodominio.com -d www.tuodominio.com

Certbot configura anche un job cron o un timer systemd per il rinnovo automatico dei certificati, che avviene tipicamente ogni 60-90 giorni, ben prima della scadenza di 90 giorni. Puoi testare il meccanismo di rinnovo con:

sudo certbot renew --dry-run

Questo assicura che il tuo sito rimanga sempre accessibile via HTTPS senza interruzioni.

Security headers: HSTS, X-Frame-Options, CSP

Oltre alla crittografia, i security headers HTTP sono un potente strumento per mitigare attacchi client-side. Li aggiungeremo al blocco server HTTPS di Nginx.

  • Strict-Transport-Security (HSTS): Forza i browser a usare solo connessioni HTTPS per il tuo dominio, prevenendo attacchi di downgrade SSL/TLS. Il valore max-age indica per quanto tempo il browser deve ricordare questa impostazione (31536000 secondi = 1 anno).
  • X-Frame-Options: Previene il clickjacking, impedendo che le tue pagine vengano incorporate in un