Il tuo server web risponde lento? I certificati SSL scadono senza che te ne accorga? I virtual host ti sembrano un rebus?
Noi vediamo ogni giorno realtà che perdono clienti perché il sito impiega 4 secondi a caricare la prima riga, o magari perché un rinnovo SSL non automatizzato manda tutto offline per ore. Poi arriva la telefonata: "Meteora, il sito non funziona".
Nginx non è solo un web server veloce e leggero — è la scelta giusta per chi vuole controllo, sicurezza e performance senza spendere una fortuna in licenze. In questa guida ti portiamo dall'installazione su Linux (Ubuntu/Debian) alla configurazione di virtual host, SSL con Let's Encrypt e ottimizzazioni base per tenere il sito scattante. Nessuna teoria astratta: solo comandi che puoi copiare, incollare e testare subito.
Perché Nginx è la scelta migliore per il tuo server Linux?
La differenza principale tra Nginx e Apache la puoi raccontare con un esempio: Apache crea un nuovo processo per ogni connessione, Nginx invece gestisce migliaia di connessioni con un unico thread event-driven. Tradotto: Nginx consuma meno RAM e regge più traffico simultaneo. Per una PMI che ha un e-commerce su WooCommerce o un portale B2B, questo significa risparmiare sul costo del server e non andare in crash durante i picchi.
Noi abbiamo scelto Nginx per tutti i progetti da zero, sia su stack LEMP (Linux Nginx MySQL PHP) che per piattaforme Laravel. Quando un cliente arriva da noi con Apache, spesso la prima ottimizzazione che facciamo è migrare a Nginx: i tempi di risposta calano del 30-50% senza toccare una riga di codice applicativo.
In più, Nginx ha un sistema di virtual host chiarissimo — file di configurazione separati per dominio, nessuna confusione con .htaccess (che infatti non supporta, e meno male).
Sponsored Protocol
Come installare Nginx su Ubuntu Server?
Partiamo da una VM o VPS con Ubuntu 22.04 o 24.04. Apri il terminale e aggiorna i pacchetti:
sudo apt update && sudo apt upgrade -yPoi installa Nginx:
sudo apt install nginx -yAl termine, avvia e abilita all'avvio:
sudo systemctl start nginx
sudo systemctl enable nginxControlla che sia attivo:
sudo systemctl status nginxApri il browser e visita l'indirizzo IP del server. Dovresti vedere la pagina di default di Nginx. Se non la vedi, controlla il firewall — su Ubuntu di solito ufw è disattivo, ma se hai un VPS di un provider come DigitalOcean o Aruba, potresti dover aprire le porte 80 e 443.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reloadErrore comune: credere che "nginx -t" basti. In realtà serve a testare la sintassi della configurazione, ma non avvia il server. Ricorda sempre di fare systemctl reload o restart dopo ogni modifica.
Come configurare i virtual host (server block) su Nginx?
Nginx chiama i virtual host server block. Ogni dominio (es. miosito.it e admin.miosito.it) avrà un file separato nella directory /etc/nginx/sites-available/. Poi lo attivi con un link simbolico in /etc/nginx/sites-enabled/.
Creare un server block per un dominio semplice (sito statico o PHP)
Supponiamo che il tuo dominio sia esempio.it e i file del sito siano in /var/www/esempio.it/html. Crea la directory:
sudo mkdir -p /var/www/esempio.it/html
sudo chown -R www-data:www-data /var/www/esempio.itOra crea il file di configurazione:
sudo nano /etc/nginx/sites-available/esempio.itE inserisci:
Sponsored Protocol
server {
listen 80;
server_name esempio.it www.esempio.it;
root /var/www/esempio.it/html;
index index.html index.php index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
}Attiva il sito:
sudo ln -s /etc/nginx/sites-available/esempio.it /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxAttenzione: il percorso di fastcgi_pass dipende dalla versione di PHP installata. Se hai PHP 8.1, sarà php8.1-fpm.sock. Verifica con ls /var/run/php/.
Se non usi PHP (sito statico), puoi eliminare il blocco location ~ \.php$.
Virtual host con sottodominio
Stessa procedura, ma nel server_name metti admin.esempio.it e crei una directory separata. Puoi avere quanti server block vuoi, ognuno col suo contenuto.
Errore comune: dimenticare di rimuovere il default link simbolico /etc/nginx/sites-enabled/default se non lo usi. Altrimenti Nginx farà match con quello e il tuo dominio potrebbe non funzionare. Disabilitalo con sudo rm /etc/nginx/sites-enabled/default.
Come abilitare SSL su Nginx con Let's Encrypt (certificato gratuito)?
Niente scuse per non avere HTTPS. Let's Encrypt è gratuito e con Certbot l'installazione è automatica. Noi lo facciamo su ogni progetto — un cliente che vende online senza SSL oggi è come un negozio con la saracinesca alzata ma senza porta.
Installare Certbot e ottenere il certificato
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d esempio.it -d www.esempio.itCertbot modifica automaticamente il tuo server block, aggiungendo la direttiva listen 443 ssl e il reindirizzamento da HTTP a HTTPS. Ti chiederà un indirizzo email per le notifiche di rinnovo (obbligatorio).
Sponsored Protocol
Il certificato è valido 90 giorni. Per il rinnovo automatico, Certbot aggiunge un timer systemd. Verifica con:
sudo systemctl status certbot.timerPuoi testare il rinnovo in modalità dry-run:
sudo certbot renew --dry-runAttenzione: se il tuo sito non è ancora raggiungibile pubblicamente (es. in fase di sviluppo su IP locale), Let's Encrypt non può validare il dominio. Allora usa certificati autofirmati per i test, ma mai in produzione.
Configurazione SSL manuale (se preferisci il controllo)
Se vuoi personalizzare i parametri SSL (es. disabilitare protocolli obsoleti, forzare HSTS), modifica direttamente il server block dopo aver ottenuto il certificato:
server {
listen 443 ssl http2;
server_name esempio.it www.esempio.it;
root /var/www/esempio.it/html;
ssl_certificate /etc/letsencrypt/live/esempio.it/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/esempio.it/privkey.pem;
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;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
try_files $uri $uri/ =404;
}
}Poi non dimenticare di fare reload: sudo systemctl reload nginx.
Come ottimizzare Nginx per migliorare le performance?
Una volta che il server è su e HTTPS funziona, possiamo rendere il sito più veloce senza cambiare una riga di PHP o HTML.
Sponsored Protocol
Compressione gzip
Abilita la compressione dei file testuali (HTML, CSS, JS, JSON). Nel file /etc/nginx/nginx.conf dentro il blocco http:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;Poi ricarica Nginx. Impatto immediato: il peso delle risorse scende del 50-70%.
Cache delle risorse statiche
Imposta header di cache per immagini, font, CSS, JS che non cambiano spesso. Aggiungi nel server block (o in un file separato):
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|svg|webp|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}Attenzione: non usare expires 1y per file che aggiorni frequentemente senza cambiare nome. Meglio versionare con hash nel nome del file.
Limitazione delle richieste
Proteggi il server da attacchi semplici con limit rate. Nel contesto http:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;Poi applicalo a location specifiche, es. login o API:
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
...
}Non fermerà un attacco DDoS serio, ma blocca i tentativi di brute force e i crawler malevoli.
Worker processes e connection
Modifica /etc/nginx/nginx.conf in base al numero di CPU del server. Di solito:
worker_processes auto;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}auto imposta worker_processes pari al numero di core. epoll è il metodo di I/O più efficiente su Linux.
Come testare e monitorare le performance di Nginx?
Dopo ogni modifica, verifica con strumenti semplici ma efficaci:
Sponsored Protocol
- nginx -t : controlla la sintassi della configurazione.
- curl -I https://tuodominio.it : mostra gli header di risposta, utile per vedere se la cache e la compressione funzionano.
- PageSpeed Insights o GTmetrix : misurano il tempo di caricamento da utente reale.
- ab (Apache Bench) : test di carico veloce:
sudo apt install apache2-utils && ab -n 1000 -c 50 https://tuodominio.it/
Noi, di Meteora Web, controlliamo sempre i log di Nginx quando un cliente segnala lentezza: /var/log/nginx/access.log e error.log. Un errore 502 spesso significa che PHP-FPM è morto per mancanza di memoria. Un 499 indica che il client ha chiuso la connessione — magari perché il server è troppo lento.
Cosa fare adesso
- Installa Nginx su un server di test (anche locale con Vagrant o Docker).
- Crea un virtual host per un dominio fittizio e metti dentro una pagina HTML di prova.
- Abilita HTTPS con Certbot — anche se il dominio non è reale, prova con un certificato autofirmato per capire il meccanismo.
- Applica le ottimizzazioni (gzip, cache, worker) e misura la differenza con GTmetrix.
- Leggi la nostra guida pillar su Linux per sviluppatori e sysadmin per approfondire shell, sicurezza e automazione: Linux per Sviluppatori e Sysadmin.
Se vuoi andare oltre, guarda la documentazione ufficiale di Nginx e il Mozilla SSL Configuration Generator per configurazioni SSL avanzate.
Hai già un sito in produzione? Controlla ora se il certificato è valido e se la compressione gzip è attiva. Se non sai da dove partire, contattaci — valutiamo il tuo setup e ti diamo un piano per mettere in sicurezza e velocizzare il server.