Distribuzione di uno Stack Web Performante: Nginx & PHP 8.2 FPM
Questa guida ti accompagna nell'installazione di un ambiente server robusto e sicuro su un VPS, ideale per ospitare framework moderni come Laravel, Symfony o CMS come WordPress.
🎯 Obiettivi della configurazione
- Server Web: Nginx (alte prestazioni per connessioni simultanee).
- Motore PHP: PHP 8.2 tramite FPM (FastCGI Process Manager).
- Sicurezza: HTTPS tramite Let's Encrypt, firewall UFW e protezione contro il brute-force.
- Ottimizzazione: Cache statica e gestione pulita dei diritti di accesso.
📋 Requisiti
- Un server con Debian 12 o Ubuntu 22.04+.
- Accesso SSH con privilegi
sudo. - Un nome di dominio il cui record "A" punta all'IP del tuo server.
Passo 1: Preparazione e installazione di Nginx
Inizia aggiornando l'elenco dei pacchetti e installa il server web.
# Aggiornamento del sistema
sudo apt update && sudo apt upgrade -y
# Installazione e attivazione di Nginx
sudo apt install -y nginx
sudo systemctl enable --now nginx
Configurazione del Firewall (UFW): Consenti il traffico web affinché il tuo sito sia accessibile.
sudo ufw allow "Nginx Full"
Passo 2: Installazione e ottimizzazione di PHP 8.2
Installiamo PHP 8.2 con le estensioni essenziali per la maggior parte delle applicazioni moderne.
# Installazione di PHP-FPM e dei moduli comuni
sudo apt install -y php8.2-fpm php8.2-cli php8.2-mysql php8.2-curl \
php8.2-xml php8.2-gd php8.2-zip php8.2-mbstring php8.2-intl
🔒 Sicurezza di PHP
Per impostazione predefinita, PHP può tentare di eseguire il file più vicino se non trova il file esatto richiesto. Disattiviamo questo comportamento rischioso:
# Disattivazione di cgi.fix_pathinfo
sudo sed -i 's/^\s*;*\s*cgi.fix_pathinfo\s*=.*/cgi.fix_pathinfo=0/' /etc/php/8.2/fpm/php.ini
sudo systemctl restart php8.2-fpm
Passo 3: Struttura dei file e permessi
Creeremo una cartella dedicata al tuo sito e applicheremo permessi restrittivi ma funzionali. Sostituisci mon-domaine.com con il tuo dominio reale.
# Creazione della struttura
sudo mkdir -p /var/www/mon-domaine.com/public
# Assegnazione della proprietà all'utente web (www-data)
sudo chown -R www-data:www-data /var/www/mon-domaine.com
# Sicurezza dei permessi (Cartelle a 750, File a 640)
sudo find /var/www/mon-domaine.com -type d -exec chmod 750 {} \;
sudo find /var/www/mon-domaine.com -type f -exec chmod 640 {} \;
Passo 4: Configurazione del Virtual Host Nginx
Crea un file di configurazione pulito per indicare a Nginx come gestire le richieste verso il tuo dominio.
sudo nano /etc/nginx/sites-available/mon-domaine.com
Copia questo blocco di configurazione:
server {
listen 80;
server_name mon-domaine.com www.mon-domaine.com;
root /var/www/mon-domaine.com/public;
index index.php index.html;
# Gestione degli URL puliti (Laravel/Symfony)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Esecuzione dei file PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# Ottimizzazione della cache per i file statici
location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|ico|webp)$ {
expires 7d;
access_log off;
add_header Cache-Control "public";
}
# Vietare l'accesso ai file nascosti (.env, .git, ecc.)
location ~ /\. {
deny all;
}
}
Attivazione del sito:
sudo ln -s /etc/nginx/sites-available/mon-domaine.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Passo 5: Sicurezza HTTPS (Certbot)
Passare a HTTPS è indispensabile oggi. Let's Encrypt consente di automatizzarlo gratuitamente.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mon-domaine.com -d www.mon-domaine.com
Passo 6: Manutenzione e Sicurezza avanzata
🛡️ Protezione contro gli attacchi
Installa Fail2ban per bannare automaticamente gli IP che tentano di forzare i tuoi accessi SSH o web.
sudo apt install -y fail2ban
🔍 Risoluzione rapida dei problemi (Troubleshooting)
| Sintomo | Probabile causa | Azione |
|---|---|---|
| Errore 502 Bad Gateway | PHP-FPM è fermo o il socket è errato. | sudo systemctl status php8.2-fpm |
| Errore 403 Forbidden | Permessi errati sulle cartelle o indice mancante. | Controllare chown e la cartella /public |
| Pagina PHP scaricata | Il blocco location ~ \.php$ è mancante. | Controllare la configurazione Nginx e ricaricare. |
💡 Varianti (Distribuzioni RHEL / Rocky Linux)
Se sei su una base RedHat, usa dnf. Il socket PHP si trova generalmente qui: fastcgi_pass unix:/run/php-fpm/www.sock;
