Introduzione a Nginx e PHP-FPM
Nel panorama dello sviluppo web moderno, l'efficienza e le performance sono cruciali. Nginx si è affermato come uno dei server web più performanti e scalabili, spesso preferito ad Apache per la sua architettura asincrona e event-driven, che lo rende ideale per gestire un elevato numero di connessioni concorrenti con un basso utilizzo di risorse. PHP, d'altra parte, rimane uno dei linguaggi di scripting più diffusi per lo sviluppo web lato server.
Per servire applicazioni PHP in modo efficiente con Nginx, è necessario un componente aggiuntivo: PHP-FPM (FastCGI Process Manager). A differenza di moduli come mod_php di Apache, che caricano l'interprete PHP direttamente nel processo del server web, PHP-FPM gestisce un pool di processi PHP separati. Nginx comunica con questi processi PHP tramite il protocollo FastCGI. Questo approccio disaccoppiato offre diversi vantaggi:
- Performance Migliorate: Nginx non è bloccato dall'esecuzione di codice PHP. Può continuare a gestire altre richieste mentre PHP-FPM elabora le richieste PHP.
- Maggiore Stabilità: Un crash di un processo PHP non influisce direttamente sul server Nginx, migliorando la resilienza dell'applicazione.
- Controllo delle Risorse: PHP-FPM permette una gestione più granulare dei processi PHP, inclusi limiti di connessione, riavvii automatici e configurazioni specifiche per pool.
- Flessibilità: È possibile eseguire diverse versioni di PHP o configurazioni PHP separate per diversi siti web sullo stesso server, creando pool FPM dedicati.
Questo articolo esplorerà in dettaglio come configurare Nginx con PHP-FPM, coprendo l'installazione, la configurazione di base e avanzata, e le best practice per ottimizzare le performance.
Installazione di Nginx e PHP-FPM
Prima di poter configurare Nginx con PHP-FPM, è necessario installarli sul server. I comandi variano leggermente a seconda della distribuzione Linux utilizzata. Di seguito sono riportati i comandi per le distribuzioni più comuni:
Su Debian/Ubuntu
Per prima cosa, aggiorniamo l'elenco dei pacchetti:
sudo apt update
Poi, installiamo Nginx e PHP-FPM. È consigliabile installare una versione specifica di PHP, ad esempio PHP 8.1, che include la versione corrispondente di PHP-FPM:
sudo apt install nginx php8.1-fpm
Potrebbe essere necessario installare anche altre estensioni PHP comuni, come php8.1-mysql per la connessione a database MySQL/MariaDB, php8.1-mbstring per la gestione delle stringhe multibyte, php8.1-xml per il parsing XML, ecc.
sudo apt install php8.1-mysql php8.1-mbstring php8.1-xml php8.1-zip
Su CentOS/RHEL/Fedora
Su queste distribuzioni, spesso si utilizza il repository EPEL (Extra Packages for Enterprise Linux) e Remi per ottenere versioni più recenti di PHP. Assicurati di aver abilitato questi repository.
Aggiorniamo i pacchetti:
sudo dnf update # o sudo yum update
Installiamo Nginx e PHP-FPM (esempio con PHP 8.1):
sudo dnf install nginx php-fpm
Se stai usando un repository come Remi, potresti dover installare una versione specifica, ad esempio:
sudo dnf install nginx php81-php-fpm
Anche qui, installa le estensioni PHP necessarie:
sudo dnf install php81-php-mysqlnd php81-php-mbstring php81-php-xml php81-php-zip
Dopo l'installazione, è buona norma avviare e abilitare i servizi per l'avvio automatico:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php8.1-fpm # o il nome del servizio corretto
sudo systemctl enable php8.1-fpm
Verifica lo stato dei servizi per assicurarti che siano in esecuzione:
sudo systemctl status nginx
sudo systemctl status php8.1-fpm
Configurazione di PHP-FPM
PHP-FPM viene eseguito come un demone e gestisce un pool di processi PHP. La sua configurazione principale si trova solitamente in /etc/php/<VERSIONE>/fpm/php-fpm.conf (o in un file simile, a seconda della distribuzione). Tuttavia, la configurazione dei singoli pool avviene nei file all'interno della directory pool.d/.
Il file di configurazione predefinito per il pool principale è spesso www.conf (situato in /etc/php/<VERSIONE>/fpm/pool.d/www.conf). Vediamo alcune direttive importanti:
[www]: Definisce l'inizio di una nuova configurazione di pool.wwwè il nome del pool predefinito.useregroup: Specifica l'utente e il gruppo sotto cui verranno eseguiti i processi PHP. È fondamentale impostare questi valori in modo sicuro, preferibilmente con un utente non privilegiato specifico per ogni sito o gruppo di siti.listen: Definisce come Nginx si connetterà a PHP-FPM. Può essere un socket Unix (/run/php/php<VERSIONE>-fpm.sock) o un indirizzo IP/porta (127.0.0.1:9000). I socket Unix sono generalmente più veloci e sicuri per connessioni locali.listen.owner,listen.group,listen.mode: Impostazioni relative ai permessi per i socket Unix, cruciali per garantire che Nginx possa accedere al socket.pm: Metodo di gestione dei processi PHP. Le opzioni comuni sono:static: Mantiene un numero fisso di processi.dynamic: Aggiunge e rimuove processi in base al carico, con parametri comepm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers.ondemand: Avvia nuovi processi solo quando necessario e li termina dopo un periodo di inattività.
pm.max_children: Il numero massimo di processi PHP che possono essere attivi contemporaneamente. Impostare questo valore troppo alto può esaurire la memoria del server.pm.max_requests: Il numero di richieste che un singolo processo PHP gestirà prima di essere riavviato. Utile per prevenire perdite di memoria (memory leaks).
Esempio di configurazione del pool www.conf (semplificato):
[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
Dopo aver modificato la configurazione di PHP-FPM, è necessario riavviare il servizio per applicare le modifiche:
sudo systemctl restart php8.1-fpm
Configurazione di Nginx per PHP
Nginx gestisce le richieste tramite file di configurazione, solitamente situati in /etc/nginx/nginx.conf e nelle directory /etc/nginx/conf.d/ o /etc/nginx/sites-available/ e /etc/nginx/sites-enabled/. Per servire un'applicazione PHP, è necessario configurare un blocco server che specifichi come Nginx deve gestire i file .php.
Il blocco location ~ ".+\.php$" è il cuore della configurazione per l'elaborazione PHP. Ecco un esempio di configurazione di un server block per un'applicazione PHP:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# Connessione al socket PHP-FPM
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
# Oppure, se PHP-FPM è in ascolto su TCP/IP:
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Opzionale: negare l'accesso a file .htaccess o altri file sensibili
location ~ /\. {
deny all;
}
}