Oggi vediamo come installare due versioni di PHP su Apache2 e rendere il passaggio da una versione all’altra con una facilità disarmante!
Sarebbe stato più facile avere due installazioni di Ubuntu, magari due macchine virtuali, una con PHP5.6 e PHP7, ma non sempre è la soluzione migliore.
Ad esempio, attualmente sto lavorando ad un progetto di “aggiornamento” del codice da PHP5.x a PHP7 e mi è stata fornita una (una, quindi casca il trucchetto di prima) macchina virtuale. Già rendere operativo il codice del progetto su PHP5.6 è un impresa (dovendo infatti ricreare l’ambiente dove il software in produzione risiedeva), figuriamoci su PHP7, con tutte le chiamate mysql deprecate e problemi di sicurezza.
La soluzione, per lo più obbligata, è quella di installare versioni multiple di PHP sulla stessa installazione di Ubuntu. Ci sono due metodi:
1) Effettuare lo switch delle versioni a mano, abilitando la mod di PHP per la versione 5.6 e per passare al 7, disabilitare 5.6 quindi abilitare la mod per PHP7.
2) Avere due istanze di Apache2, una per PHPh5.6 e una per PHP7, ovviamente su due porte diverse ma più avanti nell’articolo vedremo come bypassare questo “problema” e rendere il lavoro ancora più produttivo.
La seconda opzione mi è sembrata più smart e meno macchinosa per lo sviluppo. Modificando il codice del progetto, chiamando un certo URL ottengo la versione di PHP5.6 e con un altro certo URL ottengo la versione PHP7. Il risultato che ho ottenuto è il seguente, una pagina web con i vari progetti e il rimando alla versione 5.6 e 7, semplicemente con un click!
Vediamo come fare. Innanzitutto è necessario avere installato Ubuntu 16.04 e procediamo con un aggiornamento dei pacchetti, male non fa.
apt update && apt upgrade
Installiamo Apache2:
sudo apt-get install apache2
Sistemiamo il firewall:
sudo ufw allow in "Apache Full"
Se è tutto corretto dovremmo vedere questa schermata collegandosi all’IP della macchina:
Procediamo ad installare MySQL:
sudo apt-get install mysql-server
Ora mettiamo in sicurezza l’installazione di MySQL:
mysql_secure_installation
Lascio perdere la validazione della password, può portare problemi con componenti che la impostano in automatico e quindi generando un errore MySQL se la password non soddisfa le policy.
Per il resto, a parte il cambio password dell’utente root, dovresti dare tutto “Yes”.
Installiamo PHP:
sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql
Che versione di PHP ha installato? Lo scopriamo subito:
root@ubuntutest:~# php -v
PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
Ha installato PHP7, che è la versione di default su Ubuntu 16.04.
Installiamo PHP5.6 ma sarà una versione dormiente, perché non verrà abilitata in quanto è già presente PHP7. Sono 3 comandi da eseguire:
add-apt-repository ppa:ondrej/php
apt-get update
apt-get install php5.6 php5.6-mbstring php5.6-mcrypt php5.6-mysql php5.6-xml
Per avere istanze multiple di PHP dobbiamo creare i file di configurazione per PHP5.6:
cd /usr/share/doc/apache2/examples
sh ./setup-instance php5
Ha quindi creato una directory “apache2-php5” che contiene tutte le impostazioni di PHP. Dobbiamo però modificarle in modo che “apache2-php5” utilizzi PHP5.6.
a2dismod-php5 php7.0
a2enmod-php5 php5.6
Passiamo a modificare le porte di Apache2 per PHP5.6. Imposto 81 e 444 dato che 80 e 443 sono utilizzare dall’istanza di Apache primaria. Ovviamente bisogna assicurarsi che 81 e 444 siano porte libere.
nano /etc/apache2-php5/ports.conf
Andiamo a ritoccare il virtualhost di default per PHP5.6, anch’essa deve essere in ascolto alla porta 81:
nano /etc/apache2-php5/sites-available/000-default.conf
Cambiando da “<VirtualHost *:80>” a “<VirtualHost *:81>”.
Non resta che aggiungere il servizio “apache2-php5” al sistema:
systemctl enable apache2-php5
E avviamo la nuova istanza di Apache2:
service apache2-php5 start
Tocca effettuare la prova del nove. Creiamo un file phpinfo.php sulla directory web di default:
nano /var/www/html/phpinfo.php
All’interno del file molto banalmente ci inseriamo il seguente:
<php?
phpinfo();
Ora apriamo il file sia con la versione PHP5.6 che con la versione PHP7 tramite gli indirizzi:
http://IP_DEL_SERVER/phpinfo.php --> versione PHP7
http://IP_DEL_SERVER:81/phpinfo.php --> versione PHP5.6
L’articolo potrebbe concludersi qui, ma mettiamo che il firewall blocchi tutte le porte diverse da 80 e 443. Contattare la porta 81 per visualizzare la versione PHP5.6 può essere un impresa ma non se utilizziamo il modulo proxy di Apache2 e il supporto di xip.io.
Ma vediamo con calma! Per riuscire a distinguere quale virtualhost usare, Apache2 si affida ai nomi di dominio e xip.io viene in nostro soccorso. Grazie a questo servizio, per esempio, contattando 10.0.0.9.xip.io, il DNS ottiene come IP 10.0.0.9 . Possiamo quindi creare 5.10.0.0.9.xip.io (che punta sempre a 10.0.0.9) che ha un nome di dominio diverso e farlo puntare alla versione PHP5.6!
Dobbiamo quindi procedere ad installare i moduli proxy necessari sull’istanza primaria di Apache2, dato che è quella che è in ascolto alla porta 80:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_ajp
a2enmod rewrite
a2enmod deflate
a2enmod headers
a2enmod proxy_balancer
a2enmod proxy_connect
a2enmod proxy_html
Non è cambiato molto, per ora. Modifichiamo le configurazioni dei virtualhost di Apache2 versione PHP7. Creiamo il vhost per visualizzare la pagina di default vista prima in versione PHP5.6 solo se il nome di dominio corrisponde a 5.10.0.0.9.xip.io (da cambiare con l’IP corrispondente!)
cd /etc/apache2/sites-available
nano 5.000-default.conf
Da inserire questo facendo attenzione all’IP di xip.io:
<VirtualHost *:80>
ServerAdmin tua_email@example.com
ServerName 5.10.0.0.9.xip.io
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:81/
ProxyPassReverse / http://127.0.0.1:81/
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Abilitiamo il vhost e riavviamo Apache2:
a2ensite 5.000-default.conf
service apache2 reload
Ha davvero funzionato?
A quanto pare, sembra proprio di si!
Ricapitolando, abbiamo i seguenti nomi di dominio (ricordando sempre di cambiare l’IP con quello della propria macchina Ubuntu):
http://10.0.0.9.xip.io --> Ottengo le pagine web elaborate con PHP7
http://5.10.0.0.9.xip.io --> Ottengo le pagine web elaborate con PHP5.6
Con lo stesso ragionamento, possono essere installate ulteriori versioni di PHP. È sicuramente molto comodo e pratico lo sviluppo di un applicativo web cambiando versione semplicemente anteponendo un numero nell’url.