Introduzione
Nginx (pronunciato "engine-x") è un server web ad alte prestazioni, riconosciuto per la sua velocità, stabilità e basso consumo di risorse. Combinato con PHP-FPM (FastCGI Process Manager), costituisce uno stack potente per ospitare applicazioni PHP moderne come WordPress, Laravel, Symfony o Drupal.
Perché scegliere Nginx + PHP-FPM?
| Caratteristica | Apache + mod_php | Nginx + PHP-FPM |
|---|---|---|
| Memoria | Consumo elevato | Bassa impronta |
| Connessioni simultanee | Limitato | Migliaia |
| File statici | Buono | Eccellente |
| Configurazione | .htaccess distribuito | Centralizzata |
| Prestazioni | Buone | Eccellenti |
Versioni incluse per OS
| Sistema | Nginx | PHP | Kernel |
|---|---|---|---|
| Debian 13 "Trixie" | 1.26 | 8.4 | 6.12 LTS |
| Ubuntu 24.04 LTS | 1.24 | 8.3 | 6.8 |
📋 Requisiti
- Un VPS con Ubuntu 24.04 LTS o Debian 13 "Trixie"
- Accesso root o utente con privilegi sudo
- Connessione SSH stabilita
- Nome di dominio che punta all'IP del VPS (opzionale ma raccomandato)
🔄 Passo 1: Aggiornamento del sistema
Prima di qualsiasi installazione, aggiornare i pacchetti del sistema:
sudo apt update && sudo apt upgrade -y
Se è necessario un riavvio:
[ -f /var/run/reboot-required ] && sudo reboot
📦 Passo 2: Installare Nginx
Installazione
sudo apt install nginx -y
Verificare l'installazione
nginx -v
Risultato atteso:
- Debian 13:
nginx version: nginx/1.26.x - Ubuntu 24.04:
nginx version: nginx/1.24.x
Verificare lo stato del servizio
sudo systemctl status nginx
Il servizio deve mostrare active (running).
Comandi di gestione Nginx
| Azioni | Comando |
|---|---|
| Avviare | sudo systemctl start nginx |
| Fermare | sudo systemctl stop nginx |
| Riavviare | sudo systemctl restart nginx |
| Ricaricare configurazione | sudo systemctl reload nginx |
| Abilitare all'avvio | sudo systemctl enable nginx |
| Disabilitare all'avvio | sudo systemctl disable nginx |
| Testare la configurazione | sudo nginx -t |
Configurare il firewall (UFW)
Se UFW è attivato, consentire il traffico HTTP e HTTPS:
# Verificare lo stato UFW
sudo ufw status
# Consentire Nginx (HTTP + HTTPS)
sudo ufw allow 'Nginx Full'
# Oppure consentire separatamente
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Testare l'installazione
Apri il tuo browser e accedi a http://VOSTRO_IP_VPS. Dovresti vedere la pagina di benvenuto di Nginx con il messaggio "Welcome to nginx!".
🐘 Passo 3: Installare PHP-FPM
Per Debian 13 "Trixie" (PHP 8.4)
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-soap php8.4-opcache php8.4-readline -y
Per Ubuntu 24.04 LTS (PHP 8.3)
sudo apt install php8.3-fpm php8.3-cli php8.3-common php8.3-mysql \
php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml \
php8.3-bcmath php8.3-intl php8.3-soap php8.3-opcache php8.3-readline -y
Installare una versione specifica tramite PPA (solo Ubuntu)
Se hai bisogno di un'altra versione di PHP su Ubuntu:
# Aggiungere il repository PPA Ondřej
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Esempio: installare PHP 8.4
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-soap php8.4-opcache -y
Verificare l'installazione di PHP
php -v
Risultato atteso:
- Debian 13:
PHP 8.4.x (cli) - Ubuntu 24.04:
PHP 8.3.x (cli)
Verificare lo stato di PHP-FPM
Debian 13:
sudo systemctl status php8.4-fpm
Ubuntu 24.04:
sudo systemctl status php8.3-fpm
Il servizio deve mostrare active (running).
Identificare il socket PHP-FPM
Il socket è cruciale per la comunicazione tra Nginx e PHP:
ls /run/php/
Risultato tipico:
- Debian 13:
php8.4-fpm.sock - Ubuntu 24.04:
php8.3-fpm.sock
⚙️ Passo 4: Configurare Nginx per PHP-FPM
Modificare la configurazione predefinita
Modifica il file di configurazione predefinito:
sudo nano /etc/nginx/sites-available/default
Configurazione per Debian 13 (PHP 8.4)
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
# Configurazione PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Bloccare l'accesso ai file .htaccess
location ~ /\.ht {
deny all;
}
}
Configurazione per Ubuntu 24.04 (PHP 8.3)
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
# Configurazione PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Bloccare l'accesso ai file .htaccess
location ~ /\.ht {
deny all;
}
}
Testare la configurazione
sudo nginx -t
Risultato atteso:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Riavviare Nginx
sudo systemctl reload nginx
✅ Passo 5: Testare PHP con Nginx
Creare un file di test PHP
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Accedere alla pagina di test
Apri il tuo browser: http://VOSTRO_IP_VPS/info.php
Dovresti vedere la pagina phpinfo() che mostra:
- Versione PHP (8.4.x o 8.3.x)
- Server API: FPM/FastCGI
- Estensioni installate
- Variabili di configurazione
Eliminare il file di test (sicurezza)
sudo rm /var/www/html/info.php
⚠️ Sicurezza: Non lasciare mai un file
phpinfo()in produzione, espone informazioni sensibili.
🌐 Passo 6: Creare un Virtual Host (Server Block)
I virtual host consentono di ospitare più siti sullo stesso server.
Creare la directory del sito
sudo mkdir -p /var/www/miosito.com/html
sudo chown -R $USER:$USER /var/www/miosito.com
sudo chmod -R 755 /var/www/miosito.com
Creare una pagina di benvenuto
nano /var/www/miosito.com/html/index.php
Aggiungi:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Benvenuto su MioSito.com</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>MioSito.com funziona!</h1>
<p>Nginx + PHP-FPM configurati con successo.</p>
<p>Versione PHP: <?php echo phpversion(); ?></p>
</body>
</html>
Creare la configurazione del virtual host
sudo nano /etc/nginx/sites-available/miosito.com
Per Debian 13 (PHP 8.4):
server {
listen 80;
listen [::]:80;
server_name miosito.com www.miosito.com;
root /var/www/miosito.com/html;
index index.php index.html index.htm;
# Logs
access_log /var/log/nginx/miosito.com.access.log;
error_log /var/log/nginx/miosito.com.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Sicurezza - bloccare i file nascosti
location ~ /\. {
deny all;
}
# Cache dei file statici
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt|woff|woff2|ttf|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
Per Ubuntu 24.04 (PHP 8.3): Sostituisci php8.4-fpm.sock con php8.3-fpm.sock.
Abilitare il virtual host
sudo ln -s /etc/nginx/sites-available/miosito.com /etc/nginx/sites-enabled/
Disabilitare il sito predefinito (opzionale)
sudo rm /etc/nginx/sites-enabled/default
Testare e ricaricare
sudo nginx -t
sudo systemctl reload nginx
🔒 Passo 7: Installare un certificato SSL (Let's Encrypt)
Installare Certbot
sudo apt install certbot python3-certbot-nginx -y
Ottenere un certificato SSL
sudo certbot --nginx -d miosito.com -d www.miosito.com
Segui le istruzioni:
- Inserisci il tuo indirizzo email
- Accetta i termini
- Scegli di reindirizzare HTTP verso HTTPS (raccomandato)
Verificare il rinnovo automatico
sudo certbot renew --dry-run
⚡ Passo 8: Ottimizzare PHP-FPM
Configurazione del pool PHP-FPM
Debian 13:
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
Ubuntu 24.04:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
Parametri raccomandati in base alla RAM
VPS 1-2 Go RAM:
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
VPS 4 Go RAM:
pm = dynamic
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 1000
VPS 8+ Go RAM:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 2000
Spiegazione dei parametri
| Parametro | Descrizione |
|---|---|
pm | Modalità di gestione dei processi (static, dynamic, ondemand) |
pm.max_children | Numero massimo di processi figli |
pm.start_servers | Processi all'avvio |
pm.min_spare_servers | Min processi inattivi |
pm.max_spare_servers | Max processi inattivi |
pm.max_requests | Richieste prima del riciclo del processo |
Ottimizzare php.ini
Debian 13:
sudo nano /etc/php/8.4/fpm/php.ini
Ubuntu 24.04:
sudo nano /etc/php/8.3/fpm/php.ini
Parametri raccomandati:
; Memoria
memory_limit = 256M
; Upload
upload_max_filesize = 64M
post_max_size = 64M
; Esecuzione
max_execution_time = 300
max_input_time = 300
max_input_vars = 3000
; Fuso orario
date.timezone = Europe/Rome
; OPcache (migliora le prestazioni)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 1
; Sicurezza
expose_php = Off
Riavviare PHP-FPM
Debian 13:
sudo systemctl restart php8.4-fpm
Ubuntu 24.04:
sudo systemctl restart php8.3-fpm
⚡ Passo 9: Ottimizzare Nginx
Configurazione principale
sudo nano /etc/nginx/nginx.conf
Configurazione ottimizzata:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# Parametri di base
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# Dimensione dei buffer
client_max_body_size 64M;
client_body_buffer_size 128k;
# MIME types
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Compressione Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript
application/rss+xml application/atom+xml image/svg+xml;
# Include
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Riavviare Nginx
sudo nginx -t
sudo systemctl restart nginx
🛡️ Passo 10: Sicurezza dell'installazione
Headers di sicurezza
Aggiungi nella tua configurazione del server block:
# Headers di sicurezza
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Limitare le richieste (rate limiting)
Nel /etc/nginx/nginx.conf, sezione http:
# Zone di limitazione
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
Nel tuo server block:
location / {
limit_req zone=one burst=20 nodelay;
limit_conn addr 10;
}
📁 Struttura dei file
Nginx
| Percorso | Descrizione |
|---|---|
/etc/nginx/nginx.conf | Configurazione principale |
/etc/nginx/sites-available/ | Configurazioni disponibili |
/etc/nginx/sites-enabled/ | Configurazioni attive (link simbolici) |
/etc/nginx/snippets/ | Snippet di configurazione |
/var/log/nginx/ | Log di accesso e di errore |
PHP-FPM
| Percorso (Debian 13) | Percorso (Ubuntu 24.04) | Descrizione |
|---|---|---|
/etc/php/8.4/fpm/php.ini | /etc/php/8.3/fpm/php.ini | Configurazione PHP |
/etc/php/8.4/fpm/pool.d/www.conf | /etc/php/8.3/fpm/pool.d/www.conf | Configurazione del pool |
/run/php/php8.4-fpm.sock | /run/php/php8.3-fpm.sock | Socket FPM |
Siti web
| Percorso | Descrizione |
|---|---|
/var/www/html/ | Sito predefinito |
/var/www/miosito.com/html/ | Radice di un sito personalizzato |
🔧 Comandi utili
Gestione dei servizi
# Nginx
sudo systemctl start|stop|restart|reload|status nginx
# PHP-FPM (Debian 13)
sudo systemctl start|stop|restart|status php8.4-fpm
# PHP-FPM (Ubuntu 24.04)
sudo systemctl start|stop|restart|status php8.3-fpm
Test e diagnostica
# Testare la configurazione Nginx
sudo nginx -t
# Testare la configurazione PHP-FPM (Debian 13)
sudo php-fpm8.4 -t
# Testare la configurazione PHP-FPM (Ubuntu 24.04)
sudo php-fpm8.3 -t
# Visualizzare i processi PHP-FPM
ps aux | grep php-fpm
# Visualizzare le connessioni attive
ss -tlnp | grep -E 'nginx|php'
# Log in tempo reale
sudo tail -f /var/log/nginx/error.log
Gestione dei siti
# Abilitare un sito
sudo ln -s /etc/nginx/sites-available/miosito.com /etc/nginx/sites-enabled/
# Disabilitare un sito
sudo rm /etc/nginx/sites-enabled/miosito.com
# Elencare i siti attivi
ls -la /etc/nginx/sites-enabled/
🔍 Risoluzione dei problemi
"502 Bad Gateway"
Cause: PHP-FPM non funziona o socket errato
Soluzioni:
# Verificare PHP-FPM (adattare la versione)
sudo systemctl status php8.4-fpm
# Verificare il socket
ls -la /run/php/
# Riavviare PHP-FPM
sudo systemctl restart php8.4-fpm
"403 Forbidden"
Cause: Permessi errati
Soluzioni:
# Correggere i permessi
sudo chown -R www-data:www-data /var/www/miosito.com
sudo chmod -R 755 /var/www/miosito.com
"404 Not Found" per i file PHP
Cause: Configurazione PHP-FPM errata
Verifiche:
- Il file esiste
- La direttiva
rootè corretta in Nginx - Il blocco
location ~ \.php$è presente - Il socket corrisponde alla versione PHP installata
Pagina bianca (PHP non eseguito)
Cause : PHP-FPM non connesso a Nginx
Soluzioni :
# Controllare la versione del socket
ls /run/php/
# Confrontare con la configurazione Nginx
grep fastcgi_pass /etc/nginx/sites-enabled/*
📋 Riepilogo rapido
Installazione completa Debian 13
# Aggiornamento
sudo apt update && sudo apt upgrade -y
# Nginx
sudo apt install nginx -y
# PHP-FPM 8.4
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-opcache -y
# Firewall
sudo ufw allow 'Nginx Full'
# SSL
sudo apt install certbot python3-certbot-nginx -y
Installazione completa Ubuntu 24.04
# Aggiornamento
sudo apt update && sudo apt upgrade -y
# Nginx
sudo apt install nginx -y
# PHP-FPM 8.3
sudo apt install php8.3-fpm php8.3-cli php8.3-common php8.3-mysql \
php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml \
php8.3-bcmath php8.3-intl php8.3-opcache -y
# Firewall
sudo ufw allow 'Nginx Full'
# SSL
sudo apt install certbot python3-certbot-nginx -y
💡 Buone pratiche
-
Testare sempre la configurazione prima di ricaricare :
sudo nginx -t -
Utilizzare virtual hosts separati per ogni sito
-
Attivare HTTPS con Let's Encrypt per tutti i siti
-
Monitorare i log regolarmente per rilevare problemi
-
Eseguire il backup delle configurazioni prima della modifica
-
Ottimizzare PHP-FPM in base alle risorse del tuo VPS
-
Aggiornare regolarmente Nginx e PHP per la sicurezza
-
Rimuovere i file di test (info.php) dopo la verifica
