Installare diverse versioni di PHP su Apache in Debian 9

Il PHP, uno dei linguaggi di scripting per lo sviluppo di applicazioni WEB più diffusi al mondo, ha rivoluzionato fin dalla sua nascita il modo di creare le pagine di un sito internet, passando dalla staticità di quelle scritte in puro HTML a quelle dinamiche in cui l’HTML viene generato al momento, a seconda del contesto e degli eventi scatenati dall’utente durante la fruizione di un sito.

Come tutti i linguaggi nel tempo è stato evoluto, arricchito di funzioni e reso sempre più robusto agli attacchi informatici. Questo suo evolversi ha portato con sé ovvi problemi di retrocompatibilità: vecchi siti che facevano uso di funzioni che si sono evolute, o che sono state rimosse, o sostituite da altre più performanti, soffrono il problema di non funzionare più se viene aggiornata la versione di PHP. È un problema serio, perché da un lato è importante che PHP sia aggiornato per i motivi che ho detto, ma dall’altro abbiamo anche bisogno che i siti vecchi non smettano di funzionare prima dell’intervento di uno sviluppatore, o comunque possano continuare a fornire il loro servizio mentre sul server installiamo nuovi siti che si basano su versioni più recenti di PHP.

Fortunatamente esiste un modo per installare sullo stesso server web più versioni differenti di PHP.

Le più recenti versioni di PHP vengono distribuite in due principali varianti che differiscono nel modo in cui vengono gestite le richieste ed eseguiti i processi: PHP FastCGI e PHP-FPM (FastCGI Pocess Manager).
La sostanziale differenza è che FastCGI si appoggia interamente al server web (Apache nello spcifico) per gestire la comunicazione tra processo fast-cgi e client, in questa maniera: ogni volta che arriva una nuova richiesta in ingresso, il webserver apre una connessione con il processo fast-cgi (in attesa) che a sua volta genera l’output sulla connessione con il client, trasferitagli dal server.
PHP-FPM invece gestisce direttamente i processi PHP usando un Process Manager che attende istruzioni dal server web ed esegue gli script PHP come processi separati. Questi, essendo figli del Process Manager, scaricano il server web rendendo più performante e robusto l’intero servizio. I vantaggi immediati sono i maggiori carichi gestibili a parità di risorse, e una gestione dei cambi di configuraizone e dei restart dei processi che impattano solo su FPM e non più sull’intero server web.

Vediamo quindi come installare versioni differenti di PHP-FPM sullo stesso web server Apache in una distribuzione Debian 9

In una distribuzione Debian 9 la versione PHP di default è la 7.0 in modalità FastCGI e i repository di base non ci permettono di accedere ad altro. Dobbiamo quindi aggiungerne di nuovi e con essi anche i loro certificati.

Eseguiamo quindi i seguenti comandi:

# sudo apt-get install ca-certificates apt-transport-https
# wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -
# echo "deb https://packages.sury.org/php/ stretch main" | sudo tee /etc/apt/sources.list.d/php.list
# apt update

Ora possiamo installare le versioni di PHP che più ci piacciono.

Possono coesistere diverse versioni di PHP sullo stesso server

Nell’esempio che segue vedremo le versioni 5.6 e 7.1 di PHP convivere sullo stesso server, ma non ci sono limiti al numero di versioni che si possono installare. La procedura sarà sostanzialmente identica a questa.

# sudo apt-get install php5.6-fpm
# sudo apt-get install php7.1-fpm

Se lo desideriamo possiamo installare anche i principali pacchetti a corredo di PHP, come questi:

# apt-get install php5.6-curl php5.6-gd php5.6-json php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-xml php5.6-zip
# apt-get install php7.1-curl php7.1-gd php7.1-json php7.1-mcrypt php7.1-mbstring php7.1-mysql php7.1-xml php7.1-zip

Abbiamo detto che PHP-FPM funziona come servizio indipendente da Apache, quindi possiamo vedere se è attivo usando i comandi:

# sudo systemctl status php5.6-fpm
# sudo systemctl status php7.1-fpm

Dobbiamo ora abilitare questi moduli in Apache:

# sudo a2enmod alias proxy_fcgi

Ora per rendere la versione PHP 5.6 quella di default dobbiamo eseguire:

# sudo a2enconf php5.6-fpm

Se era installata una versione PHP FastCGI dobbiamo disabilitarla o disinstallarla:

# sudo a2dismod php5.6 php7.1

E per finire riavviamo Apache:

# sudo systemctl restart apache2

A questo punto tutti i siti preinstallati utilizzeranno PHP 5.6-FPM per funzionare, ma se vogliamo che uno di questi o quelli nuovi usino la versione 7.1 è sufficiente modificare il VirtualHost:

# vi /etc/apache2/sites-available/new.miosito.it.conf

E inserire la direttiva:

Include "conf-available/php7.1-fpm.conf"

Esempio

<VirtualHost *:80>
  ServerName www.miosito.it
  Include "conf-available/php7.1-fpm.conf"
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/www.miosito.it

  <Directory /var/www/www.miosito.it>
    AllowOverride All
  </Directory>
</VirtualHost>

E ricarichiamo la configurazione in Apache

# sudo systemctl reload apache2

Per fare una prova è suffiente editare un file di prova che possiamo chiamare phpinfo.php e inserirlo nella root del sito da verificare (si consiglia poi di cancellare questo file, soprattutto in ambiente di produzione)

# vi /var/www/www.miosito.it/phpinfo.php

Inserire il codice:

<?php
  phpinfo();
?>

Salvare e uscire con la sequenza di tasti ESC :wq
Quindi aprire un browser e consultare il sito http://www.miosito.it/phpinfo.php