Nginx è il motore di oltre il 30% di tutti i server web a livello globale. Che tu stia servendo un sito statico, agendo da reverse proxy per un'applicazione Node.js, o bilanciando il carico tra più server backend, è molto probabile che Nginx sia coinvolto. Padroneggiare la sua configurazione è una competenza fondamentale per ogni sviluppatore web che desidera deployare autonomamente le proprie applicazioni.

Il Blocco Server Base: Fondamenta della Tua Configurazione

Ogni sito o applicazione web gestita da Nginx si basa su blocchi `server`. Questi definiscono come Nginx deve rispondere a determinate richieste. Per un sito statico, la configurazione è relativamente semplice e si concentra sull'indicare a Nginx dove trovare i file e quali file servire di default.

Configurazione per Sito Statico
server {
    listen 80; # Ascolta sulla porta 80 per richieste HTTP
    server_name iltuosito.com www.iltuosito.com; # Domini che questo blocco deve gestire
    root /var/www/iltuosito.com/public_html; # Directory principale dei file del sito
    index index.html index.htm; # File da servire quando viene richiesta una directory

    # Gestione delle richieste per le risorse statiche
    location / {
        try_files $uri $uri/ =404; # Tenta di servire il file richiesto, poi la directory, altrimenti restituisce un 404
    }

    # Pagine di errore personalizzate per un'esperienza utente migliore
    error_page 404 /error/404.html;
    error_page 500 502 503 504 /error/50x.html;
    location /error/ {
        internal; # Impedisce l'accesso diretto alle pagine di errore
    }
}

Reverse Proxy: Collega Nginx alla Tua Applicazione

Molte applicazioni moderne, specialmente quelle basate su Node.js, Python (Flask/Django), Ruby o Go, vengono eseguite su porte specifiche del server. Nginx eccelle come reverse proxy, inoltrando le richieste esterne all'applicazione in esecuzione e servendo contenuti statici in modo efficiente.

Reverse Proxy per Applicazione Node.js
server {
    listen 80;
    server_name api.iltuosito.com;

    location / {
        # Inoltra le richieste all'applicazione Node.js in ascolto sulla porta 3000
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1; # Utilizza HTTP/1.1 per una migliore gestione delle connessioni
        proxy_set_header Upgrade $http_upgrade; # Trasmette le informazioni di upgrade per WebSocket
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host; # Invia l'host originale alla backend
        proxy_set_header X-Real-IP $remote_addr; # Invia l'IP del client reale
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Aggiunge l'IP del proxy alla lista
        proxy_set_header X-Forwarded-Proto $scheme; # Indica il protocollo originale (HTTP/HTTPS)
        proxy_read_timeout 60s; # Imposta un timeout più lungo per richieste complesse
        proxy_connect_timeout 60s;
    }
}

SSL/TLS: Assicura le Tue Connessioni con Let's Encrypt

La sicurezza è paramount. L'implementazione di SSL/TLS non è più un'opzione, ma una necessità. Let's Encrypt offre certificati gratuiti e automatizzati. Nginx può facilmente gestire il reindirizzamento da HTTP a HTTPS e configurare il tuo server per utilizzare le ultime e più sicure impostazioni TLS.

Configurazione HTTPS con Let's Encrypt
# Blocco per reindirizzare tutto il traffico HTTP a HTTPS
server {
    listen 80;
    server_name iltuosito.com www.iltuosito.com;
    return 301 https://$host$request_uri; # Reindirizzamento permanente a HTTPS
}

# Blocco server per gestire il traffico HTTPS
server {
    listen 443 ssl http2; # Ascolta sulla porta 443, abilita SSL e HTTP/2
    server_name iltuosito.com www.iltuosito.com;

    # Percorsi ai certificati Let's Encrypt (assicurati che siano corretti)
    ssl_certificate /etc/letsencrypt/live/iltuosito.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/iltuosito.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/iltuosito.com/chain.pem;

    # Impostazioni SSL moderne per massima sicurezza e compatibilità
    ssl_protocols TLSv1.2 TLSv1.3; # Utilizza solo protocolli sicuri
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off; # Permette al client di scegliere la cifratura, migliorando la compatibilità
    ssl_session_tickets off; # Disabilita i ticket di sessione per una maggiore sicurezza

    # HSTS: Forza il browser a usare HTTPS per un anno
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # Configurazione del sito (es. root e location)
    root /var/www/iltuosito.com/public_html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # ... altre configurazioni come reverse proxy, ecc.
}

Compressione Gzip: Riduci le Dimensioni dei Tuoi File

La compressione Gzip riduce drasticamente le dimensioni dei file di testo (HTML, CSS, JavaScript) inviati al browser, migliorando i tempi di caricamento e l'esperienza utente. Nginx può gestire questa compressione lato server in modo trasparente.

Abilitazione Compressione Gzip
# Da inserire nel blocco http {} o server {}
gzip on; # Abilita la compressione Gzip
gzip_vary on; # Invia l'header Vary: Accept-Encoding per indicare che la risposta è compressa
gzip_proxied any; # Comprime le risposte per tutte le richieste proxy
gzip_min_length 1024; # Imposta la lunghezza minima in byte per comprimere (es. 1KB)
gzip_comp_level 6; # Livello di compressione (da 1 a 9, più alto è meglio ma richiede più CPU)
gzip_buffers 16 8k; # Numero e dimensione dei buffer di compressione
gzip_types
    text/plain
    text/css
    text/javascript
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/xhtml_xml
    image/svg+xml; # Tipi MIME di file da comprimere

Header di Sicurezza: Proteggi il Tuo Sito dalle Minacce Comuni

Implementare header HTTP di sicurezza è un passo fondamentale per proteggere il tuo sito da attacchi come XSS, clickjacking e altre vulnerabilità. Nginx ti permette di aggiungere facilmente questi header alle risposte.

Configurazione Header di Sicurezza
# Aggiungi questi header nel blocco server {}
add_header X-Frame-Options "SAMEORIGIN" always; # Previene il clickjacking impedendo il caricamento in iframe
add_header X-Content-Type-Options "nosniff" always; # Impedisce al browser di "indovinare" il tipo MIME
add_header X-XSS-Protection "1; mode=block" always; # Abilita il filtro XSS del browser
add_header Referrer-Policy "strict-origin-when-cross-origin" always; # Controlla quali referrer vengono inviati
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; # Restringe l'accesso a sensori/API del browser
# Content-Security-Policy (CSP) è molto potente e richiede una configurazione attenta
# Esempio di base, da adattare alle esigenze specifiche del tuo sito:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;" always;

Caching delle Risorse Statiche: Velocizza il Caricamento

Il browser può memorizzare nella cache le risorse statiche (immagini, CSS, JS) per evitare di doverle scaricare nuovamente ad ogni visita. Configurare correttamente gli header di caching in Nginx indica al browser per quanto tempo può conservare queste risorse, migliorando drasticamente le prestazioni per gli utenti abituali.

Configurazione Caching per Risorse Statiche
# Configura il caching per file statici nella tua location /
location ~* \.(jpg|jpeg|png|gif|ico|svg|css|js|woff2|woff|ttf)$ {
    expires 1y; # Imposta la scadenza della cache a 1 anno
    add_header Cache-Control "public, immutable"; # Indica che la risorsa è pubblica e immutabile
    access_log off; # Non registrare gli accessi a questi file per ridurre il carico del log
}

# Assicurati di non cachare le pagine HTML dinamicamente generate
location ~* \.html$ {
    expires -1; # Disabilita la cache lato client
    add_header Cache-Control "no-cache, no-store, must-revalidate"; # Direttive per non cachare
    add_header Pragma "no-cache";
}

Rate Limiting: Proteggi le Tue API e i Tuoi Server

Per proteggere le tue API da abusi, attacchi brute-force o semplicemente per gestire il carico, Nginx offre potenti funzionalità di rate limiting. Puoi limitare il numero di richieste che un singolo client può effettuare in un dato intervallo di tempo.

Implementazione Rate Limiting per API
# Definisci una zona per memorizzare le statistiche del rate limiting (nel blocco http {})
# $binary_remote_addr usa l'indirizzo IP binario per risparmiare memoria
# zone=api:10m definisce una zona chiamata "api" da 10 megabyte
# rate=10r/s imposta una media di 10 richieste al secondo
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

# Applica il limite di richieste a una specifica location (es. la tua API)
location /api/ {
    limit_req zone=api burst=20 nodelay; # Consente fino a 20 richieste "di burst" senza ritardo
    limit_req_status 429; # Restituisce HTTP 429 Too Many Requests quando il limite viene superato
    proxy_pass http://127.0.0.1:3000; # Il tuo backend API
    # ... altre impostazioni di proxy
}

Comandi Utili per la Gestione di Nginx

Mantenere il tuo server Nginx funzionante senza intoppi richiede familiarità con alcuni comandi essenziali. Testare la configurazione prima di applicarla e ricaricare Nginx in modo sicuro sono pratiche fondamentali.

Comandi di Gestione Nginx
# Verifica la sintassi dei file di configurazione di Nginx
sudo nginx -t

# Ricarica la configurazione di Nginx senza interrompere le connessioni attive (zero downtime)
sudo systemctl reload nginx
# Oppure: sudo service nginx reload

# Visualizza gli errori in tempo reale nel log degli errori
sudo tail -f /var/log/nginx/error.log

# Visualizza gli accessi in tempo reale nel log degli accessi
sudo tail -f /var/log/nginx/access.log

# Riavvia completamente Nginx (potrebbe causare una breve interruzione)
sudo systemctl restart nginx

Prova i Nostri Strumenti Gratuiti per Sviluppatori

Minifica e formatta il tuo codice HTML, CSS e JavaScript per ottimizzare le prestazioni e la leggibilità.