Linux10 dicembre 2025 516 visualizzazioni

Installare Nginx e PHP-FPM su un VPS Linux

Installare Nginx e PHP-FPM su un VPS Linux

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:

  1. Inserisci il tuo indirizzo email
  2. Accetta i termini
  3. 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:

  1. Il file esiste
  2. La direttiva root è corretta in Nginx
  3. Il blocco location ~ \.php$ è presente
  4. 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

  1. Testare sempre la configurazione prima di ricaricare : sudo nginx -t

  2. Utilizzare virtual hosts separati per ogni sito

  3. Attivare HTTPS con Let's Encrypt per tutti i siti

  4. Monitorare i log regolarmente per rilevare problemi

  5. Eseguire il backup delle configurazioni prima della modifica

  6. Ottimizzare PHP-FPM in base alle risorse del tuo VPS

  7. Aggiornare regolarmente Nginx e PHP per la sicurezza

  8. Rimuovere i file di test (info.php) dopo la verifica