NGINX è il server web, alternativo ad Apache HTTP Server, che costituisce oggi lo standard de facto quando si parla di erogare siti basati su WordPress o, più in generale, applicazioni web realizzate in PHP. Ma NGINX, da solo, non è in grado di eseguire codice PHP: la dotazione base permette infatti solamente di erogare file e pagine HTML statiche. Per utilizzare PHP con NGINX è dunque indispensabile installare PHP e PHP-FPM, poi interfacciarli con NGINIX. Vediamo allora come come configurare NGINX e PHP 8 su Ubuntu
Procedura aggiornata e ottimizzata per rispecchiare la disponibilità di PHP 8.2 e ottenere il miglior risultato con Ubuntu 22.04
In questo articolo ci concentreremo, nello specifico, sulla configurazione di NGINX e PHP su Ubuntu. Per la guida equivalente, ma utilizzando Apache HTTP Server al posto di NGINX, fai riferimento alle rispettive trattazioni dedicate che trovi qui:
La procedura seguente è stata testata su Ubuntu 22.04 e 20.04 (sia "Desktop", sia "Server"), ma è analoga per tutte le distribuzioni derivate (fra le quali "Mint") e, presumibilmente, per le iterazioni successive.
Una stesura precedente di questa guida (archiviata qui) trattava anche CentOS, mentre oggi è focalizzata unicamente su Ubuntu.
Per quanto riguarda PHP: l'ultima versione testata è PHP 8.2, ma nel corso degli anni ho svolto la medesima configurazione anche sulle generazioni precedenti: PHP 8.x, PHP 7.x e PHP 5.6.
Prima di configurare NGINX e PHP...
Prima di iniziare a impartire comandi è opportuno ricordare come funziona il flusso di richiesta e risposta di una "pagina PHP":
- il browser web del visitatore invia la richiesta al server che ospita il sito che l'utente vuole visualizzare
- su tale server è in esecuzione NGINX, cioè un programma, detto "server web", in grado di elaborare la richiesta
- NGINX comunica con l'interprete PHP per elaborare la pagina richiesta
- l'interprete PHP esegue il codice PHP della pagina, che può prevedere logiche per la lettura/scrittura da un database, la gestione dei cookie, la sessione utente o l'accesso a risorse esterne
- l'interprete PHP restituisce a NGINX la pagina elaborata, sottoforma di HTML
- NGINX invia detta pagina HTML al visitatore
- il browser web del visitatore legge la pagina HTML ricevuta e la mostra
- in caso la pagina HTML includesse altre risorse, come immagini, fogli di stile o file javascript, li richiede al server web
- il server web restituisce tali risorse al browser del visitatore, che le mostra nella pagina
Tale flusso è volutamente semplificato (non abbiamo parlato di DNS, indirizzi IP, router e porte TCP) ma è funzionale alla trattazione corrente. Il concetto-chiave da capire è che il browser web del visitatore non interagisce direttamente con la pagina PHP, ma solamente con il software impiegato come server web.
PHP 8 e NGINX, Passo 1: Installare NGINX
Per quanto appena detto, la prima cosa da fare è proprio... installare NGINX. Segui dunque la procedura trattata in questo approfondimento dedicato:
» Leggi: Come installare NGINX su Ubuntu - La Guida Definitiva per configurare un Server Web con Linux
Ti raccomando caldamente di non andare oltre fino a quando non sarai riuscito, quantomeno, a visualizzare una pagina HTML statica erogata tramite NGINX.
PHP 8 e NGINX, Passo 2: Installare PHP e PHP-FPM
Procedi dunque ad installare PHP. Nello specifico: NGINX richiede PHP-FPM (FastCGI Process Manager). Si tratta di una modalità nella quale l'interprete PHP, ovvero il programma che legge il codice presente nei file .php e li esegue, viene eseguito come servizio indipendente, con il quale poi il server web si interfaccia tramite il protocollo FastCGI. Abbiamo visto la procedura passo per passo in questo approfondimento:
» Leggi: Guida: come installare PHP su Ubuntu Linux (PHP-FPM)
Una volta fatto ciò, procediamo a configurare la comunicazione fra i due programmi.
PHP 8 e NGINX, Passo 3: Aprire il Terminale
Se stai lavorando via SSH oppure su Ubuntu Server sei già davanti alla linea di comando, quindi prosegui oltre.
Se però ti trovi in un ambiente grafico, devi avviare il Terminale: il mio metodo preferito è tramite la combinazione da tastiera Ctrl+Alt+T
. In alternativa:
- clicca sul pulsante con i 3x3 punti in basso a sinistra
- digita
terminale
- clicca sul collegamento mostrato
» Leggi anche: Come aprire il terminale di Ubuntu
PHP 8 e NGINX, Passo 4: Diventare root
La prima cosa da fare all'interno del Terminale è acquisire i privilegi massimi diventando root. Il comando è:
sudo -s
In caso ti fosse richiesta la password, digita quella del tuo utente Linux (quella che usi per eseguire login al PC)
» Leggi anche: Sudo senza password con Ubuntu: come disabilitare la richiesta di password quando si eseguono comandi come root (video)
PHP 8 e NGINX, Passo 5: Scaricare il file di configurazione per NGINX (php-fpm.conf)
Procedi scaricando il file di configurazione (visualizzabile qui) che attiva la comunicazione fra NGINX e PHP-FPM:
apt update && apt install curl -y && curl -Lo /etc/nginx/php-fpm.conf https://raw.githubusercontent.com/TurboLabIt/webstackup/master/config/nginx/40_php-fpm.conf
Il comando appena impartito renderà disponibile detto file nel percorso /etc/nginx/php-fpm.conf
PHP 8 e NGINX, Passo 6: Configurare il percorso al socket
Affinché la comunicazione fra NGINX e PHP-FPM funzioni correttamente, è necessario che i due servizi impieghino un socket condiviso. Nella configurazione standard di Ubuntu, tale socket viene esposto come se fosse un file su disco.
Il percorso di tale file deve essere inserito in due punti:
- nel file di configurazione di NGINX che abbiamo appena scaricato
- nel file di configurazione di PHP-FPM
Per scoprire il percorso del file, leggi questa informazione dal file di configurazione dedicato di PHP-FPM. Il comando da impartire è:
export PHP_VER=8.2 && cat /etc/php/${PHP_VER}/fpm/pool.d/www.conf | grep 'listen ='
Attenzione, naturalmente, a modificare il valore della variabile PHP_VER=
a seconda della versione di PHP che hai installato e che vuoi abilitare.
Come si nota nello screenshot precedente, nel mio caso il comando ha rivelato una riga simile alla seguente:
listen = /run/php/php8.2-fpm.sock
(l'altra riga, quella che inizia con ;
, si riferisce ad un altro parametro, ed è un commento)
Ebbene: proprio il percorso /run/php/php8.2-fpm.sock
è il percorso al socket che ci interessa!
In caso non dovesse funzionare, possiamo aprire manualmente il file e ispezionare il contenuto. Il comando è:
export PHP_VER=8.2 && apt install nano -y && nano /etc/php/${PHP_VER}/fpm/pool.d/www.conf
Il valore che ci interessa è quello del parametro listen =
Una volta che ti sei appuntato il percorso al socket, apri il file scaricato poco fa:
nano /etc/nginx/php-fpm.conf
All'interno di tale file, localizza la direttiva fastcgi_pass
. Come vedi, inizialmente legge qualcosa di simile a
fastcgi_pass unix:/run/php/php-fpm.sock;
Ebbene: devi modificare tale valore per fare in modo che riporti il percorso del tuo socket. Nel mio caso, ad esempio, avevo letto poco fa che il percorso del socket era /run/php/php8.2-fpm.sock
. Ecco quindi che ho modificato il parametro per farlo puntare allo stesso file:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
È di importanza cruciale che i due parametri riportino lo stesso, medesimo percorso. Ad esempio:
- PHP:
listen = /run/php/php8.2-fpm.sock
- NGINX:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
In caso il percorso fosse diverso, modificate /etc/nginx/php-fpm.conf
per uniformarlo.
Una volta fatto, salva e chiudi battendo da tastiera Ctrl+O
, poi Invio
, poi Ctrl+X
.
PHP 8 e NGINX, Passo 7: Autorizzare Nginx a connettersi al socket
Proseguiamo garantendo all'utente nginx
, ovvero quello che esegue il processo del server web, i permessi per connettersi al socket PHP. In caso contrario, Nginx mostrerà solo l'errore 502 Bad Gateway
e nei log apparirà una dicitura simile a connect() to unix:/run/php/php8.2-fpm.sock failed (13: Permission denied)
Per prevenire il problema è sufficiente aggiungere l'utente di NGINX al gruppo autorizzato a connettersi al socket:
usermod -aG www-data nginx
La modifica diverrà effettiva solo dopo il riavvio di NGINX, operazione che svolgeremo alla fine della configurazione.
PHP 8 e NGINX, Passo 8: Aprire il file di configurazione del sito
Il file di configurazione che hai scaricato al precedente capitoletto Scaricare il file di configurazione per NGINX
è attualmente "inerte". Per attivarlo, devi includerlo all'interno di ogni "sito NGINX" (server block) nel quale vuoi rendere disponibile PHP.
Iniziamo individuando il file di configurazione del sito erogato da NGINX per il quale vuoi attivare PHP:
- se hai installato Nginx tramite il repository ufficiale dei suoi sviluppatori (come altamente consigliato nella nostra guida a NGINX), detto file è situato nella cartella
/etc/nginx/conf.d/
- se hai installato NGINX tramite i repository di Ubuntu, guarda in
/etc/nginx/sites-enabled/
Una volta individuato il file di configurazione, aprilo in modifica impartendo un comando simile a:
nano /etc/nginx/conf.d/local.conf
Per questo esempio utilizzerò il file chiamato local.conf
che avevamo preparato nella guida a NGINX per erogare il sito di esempio raggiungibile all'indirizzo http://localhost.
PHP 8 e NGINX, Passo 8: Includere php-fpm.conf
Una volta davanti al file di configurazione, individua il blocco server { ... }
Al suo interno, inserisci la direttiva che include il file di configurazione di PHP scaricato al precedente capitoletto Scaricare il file di configurazione per NGINX
. Da direttiva da copia-incollare è:
include "/etc/nginx/php-fpm.conf";
Puoi inserire questa direttiva in un punto qualsiasi all'interno del blocco server { ... }
Una volta fatto, salva e chiudi battendo da tastiera Ctrl+O
, poi Invio
, poi Ctrl+X
.
PHP 8 e NGINX, Passo 9: Riavviare Nginx
Per rendere effettive le varie modifiche apportate nel corso di questa guida devi riavviare il processo di NGINX. Allo scopo, ti consiglio di usare SEMPRE questo specifico comando concatenato:
nginx -t && service nginx restart
In questo modo, NGINX verifica che la nuova configurazione sia corretta prima di avviare o riavviare il servizio. Se viene rilevato un problema:
- viene visualizzata una chiara indicazione di dove si trova l'errore
- NGINX continua a funzionare comunque con la configurazione precedente
Questo è un piccolo ma importante "trucco" che fa la differenza, soprattutto quando si utilizza NGINX su un server di produzione. Ricordalo!
PHP 8 e NGINX, Passo 10: Test di PHP
Ora è tutto è pronto. Se il computer sul quale è in esecuzione PHP è dotato di un browser web, puoi aprire direttamente http://localhost di modo da far collegare il browser web al servizio di NGINX in esecuzione sul medesimo computer
Se invece il sistema non ha il browser web, puoi simulare lo stesso comportamento impartendo questo comando:
curl -Lk http://localhost
Visualizzerai così a terminale i tag HTML che compongono la pagina web.
Indipendentemente che tu abbia usato il browser web o la linea di comando, nota la data visualizzata a centro pagina: se viene visualizzata correttamente, significa che PHP sta funzionando e hai terminato.
Se lo spazio dopo la "freccia" rimane bianco, invece, c'è qualcosa che non va: ripercorri i vari Passi di questo articolo fino ad individuare l'errore.
Cosa fare ora
Se non vengono mostrati messaggi di errore, significa che ha raggiunto l'obbiettivo: hai correttamente configurato PHP 8 e NGINX! Fai riferimento alla nostra guida generale a PHP per proseguire con le verifiche:
» Leggi: Guida: come installare PHP su Ubuntu Linux (PHP-FPM)