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.
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.
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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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à.