Apache HTTP Server è lo strumento principe per approntare server web ed erogare pagine HTML. Se però desideri utilizzare un gestore di contenuti (CMS) come WordPress o una piattaforma di eCommerce come Magento o PrestaShop hai bisogno anche dell'interprete PHP, ovvero quel componente che, materialmente, esegue il codice presente nei file .php. In questa guida vedremo dunque come configurare Apache per elaborare codice PHP 8 tramite PHP-FPM.
Procedura aggiornata e ottimizzata per rispecchiare la disponibilità di PHP 8.2 e ottenere il miglior risultato con Ubuntu 22.04
Nel prosieguo mi riferirò al software "Apache HTTP Server" chiamandolo solo "Apache", per brevità.
In questo articolo ci concentreremo, nello specifico, sulla configurazione di Apache e PHP su Ubuntu. Per la guida equivalente in ambiente Windows, o per la configurazione di PHP su 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 Apache 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 Apache, cioè un programma, detto "server web", in grado di elaborare la richiesta
- Apache 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 ad Apache la pagina elaborata, sottoforma di HTML
- Apache 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 Apache, Passo 1: Installare Apache
Per quanto appena detto, la prima cosa da fare è proprio... installare Apache. Segui dunque la procedura trattata in questo approfondimento dedicato:
» Leggi: Guida definitiva: come installare Apache su Ubuntu
Ti raccomando caldamente di non andare oltre fino a quando non sarai riuscito, quantomeno, a visualizzare una pagina HTML statica erogata tramite Apache.
PHP 8 e Apache, Passo 2: Installare PHP e PHP-FPM
Procedi dunque ad installare PHP. Per quanto riguarda la comunicazione fra Apache e PHP, sono previste principalmente due modalità alternative:
- configurare PHP come modulo di Apache (mod_php) - in questa modalità, la capacità di eseguire codice PHP viene caricata direttamente all'interno del processo di Apache. Per chi osserva il sistema, sembra a tutti gli effetti che "Apache esegua codice PHP"
- installare il servizio indipendente PHP-FPM - in questa modalità, il processo di Apache comunica con un processo indipendente, chiamato PHP-FPM, tramite il protocollo FastCGI. PHP-FPM esegue il codice PHP richiesto e restituisce la risposta ad Apache
Il primo modo è quello "classico", ed è il più facile da configurare, ma oggi è in disuso per via dell'eccessivo consumo di memoria: mod_php impone infatti di caricare una copia distinta e completa dell'interprete PHP per ogni singolo processo di Apache, occupando inutilmente memoria con gli stessi, medesimi dati.
Le configurazioni moderne utilizzando invece la seconda modalità, con PHP-FPM e l'interfacciamento dei due servizi. Nel corso della presente guida configureremo dunque Apache con PHP-FPM.
Procedi dunque ad installare PHP e PHP-FPM. 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 Apache, 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 Apache, 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 Apache, Passo 5: Disattivazione di mod_php
Per quanto spiegato sopra, in questa nostra configurazione non vogliamo usare il vetusto mod_php, preferendo invece la modalità con PHP-FPM. Iniziamo dunque assicurandoci che mod_php non sia stato attivato, magari per errore. Il comando per disattivarlo è:
a2dismod php* -f
Se mod_php non era attivo, come ci aspettiamo in situazioni standard, riceverai il messaggio ERROR: No module found matching php*!
In caso contrario, il modulo verrà disattivato.
Ora rimuoviamolo del tutto:
apt purge libapache2-mod-php* -y
PHP 8 e Apache, Passo 6: Installare proxy_fcgi
Devi ora installare un modulo aggiuntivo per Apache chiamato proxy_fcgi: si tratta del componente che si interfaccia da un lato con Apache, e dall'altro con PHP-FPM tramite protocollo FastCGI. Allo scopo, il seguente comando è sufficiente:
apt update && apt install libapache2-mod-fcgid -y
PHP 8 e Apache, Passo 7: Abilitare proxy_fcgi
Ora che il modulo è installato, devi attivarlo. Il comando è:
a2enmod proxy_fcgi setenvif
Come vedi, abbiamo attivato in un colpo solo anche un altro modulo, chiamato setenvif
(viene fornito a corredo del pacchetto standard di Apache, quindi non è necessario installarlo manualmente). Si tratta di un componente che permette di configurare condizioni if/else ed è necessario in alcune circostanze (nello specifico: ti servirà se, un giorno, vorrai usare il file di configurazione di PHP-FPM fornito di default dal pacchetto PHP - non ti preoccupare se non è chiaro al momento).
PHP 8 e Apache, Passo 7: Ottenere il file di configurazione per Apache (php-fpm.conf)
Devi ora configurare Apache di modo che si connetta a PHP-FPM per interpretare il codice PHP. Allo scopo, utilizzeremo il file di configurazione per Apache chiamato php-fpm.conf
.
L'installazione del pacchetto PHP potrebbe aver già predisposto un file adibito, ma qui ne utilizzeremo uno personalizzato, motivo per cui procedi a rimuove quello di default tramite questo comando:
rm -f /etc/apache2/conf-available/php*fpm.conf /etc/apache2/conf-enabled/php*fpm.conf
Ora scarica il file php-fpm.conf
(disponibile qui) che ho preparato. Lancia questo comando:
apt update && apt install curl -y && curl -Lo /etc/apache2/conf-available/php-fpm.conf https://raw.githubusercontent.com/TurboLabIt/webstackup/master/config/apache-httpd/php-fpm.conf
Così facendo, il file verrà salvato nel percorso /etc/apache2/conf-available/php-fpm.conf
.
PHP 8 e Apache, Passo 8: Specificare il percorso del socket
Affinché la comunicazione fra Apache 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
php-fpm.conf
di Apache, del quale abbiamo parlato un attimo fa - nel file di configurazione di PHP-FPM
Per scoprire il percorso del file che rappresenta il socket, 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 a modificare il valore della variabile PHP_VER=
presente ad inizio comando, valorizzandola opportunamente 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
è quello del 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 php-fpm.conf
di Apache:
nano /etc/apache2/conf-available/php-fpm.conf
All'interno di tale file, localizza la direttiva SetHandler
. Come vedi, inizialmente legge qualcosa di simile a
SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
Ebbene: devi modificare tale valore per fare in modo che riporti il percorso del tuo socket, scoperto un attimo fa. Nel mio caso, ad esempio, avevo letto 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:
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
È di importanza cruciale che i due parametri riportino lo stesso, medesimo percorso. Ad esempio:
- PHP:
listen = /run/php/php8.2-fpm.sock
- Apache:
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
In caso il percorso fosse diverso, modifica il valore presente nel file php-fpm.conf
Apache per uniformarlo, così come appena mostrato.
Una volta fatto, salva e chiudi battendo da tastiera Ctrl+O
, poi Invio
, poi Ctrl+X
.
PHP 8 e Apache, Passo 9: Attivare globalmente il supporto PHP
Arrivato a questo punto, devi scegliere se:
- attivare il supporto PHP a livello globale
- attivare il supporto PHP per ogni singolo sito
Attivandolo globalmente, non dovrai preoccuparti di includere la direttiva all'interno di ogni singolo Virtual Host (vedi Passo successivo). Di contro, non potrai impiegare differenti versioni di PHP sui vari Virtual Host o applicare in altro modo parametri diversi, e sarai costretto ad utilizzarne una unica per tutti.
Disattivare eventuali configurazioni residue e attivare PHP globalmente è estremamente facile. Il singolo comando concatenato è:
a2enconf php* ; a2enconf php-fpm
Probabilmente riceverai il messaggio ERROR: No conf found matching php*
, ma è normale se non ci sono configurazioni precedenti. Quello che conta è il messaggio successivo: Enabling conf php-fpm
.
A questo punto, PHP è attivato globalmente e le tue pagine dovrebbero già essere processate. Procedi oltre per il riavvio finale e la verifica.
PHP 8 e Apache, Passo 9 alternativo: Attivare il supporto PHP sul singolo sito
[ Quella che segue è una configurazione alternativa all'attivazione globale di PHP. Se già hai svolto il Passo precedente, salta al prossimo capitoletto ]
Se preferisci attivare la configurazione a livello di singolo Virtual Host, invece che globalmente, devi includere il nostro file php-fpm.conf
in ogni Virtual Host che abbisogna del supporto PHP.
Apri dunque il file di configurazione relativo al primo Virtual Host per il quale vuoi attivare PHP. Ti ricordo che i file si trovano in /etc/apache2/sites-enabled/
. Se hai seguito la nostra Guida ad Apache, già dovresti avere un Virtual Host che possiamo modificare per fare una prova:
nano /etc/apache2/sites-enabled/sito1.conf
Ora non devi fare altro se non incollare la seguente direttiva in un punto qualsiasi della configurazione (basta che sia all'interno del nodo che si chiude con </VirtualHost>
):
include /etc/apache2/conf-available/php-fpm.conf
Tutto qui! Una volta fatto, salva e chiudi battendo da tastiera Ctrl+O
, poi Invio
, poi Ctrl+X
.
PHP 8 e Apache, Passo 10: Riavviare Apache
Per rendere effettive le varie modifiche apportate nel corso di questa guida devi riavviare il processo di Apache. Allo scopo, ti consiglio di usare SEMPRE questo specifico comando concatenato:
apachectl configtest && service apache2 restart
In questo modo, Apache 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
- Apache continua a funzionare comunque con la configurazione precedente
Questo è un piccolo ma importante "trucco" che fa la differenza, soprattutto quando si utilizza Apache su un server di produzione. Ricordalo!
PHP 8 e Apache, 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 Apache 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 Apache! Fai riferimento alla nostra guida generale a PHP per proseguire con le verifiche:
» Leggi: Guida: come installare PHP su Ubuntu Linux (PHP-FPM)