PHP multipli virtualhost
Versioni multiple di PHP con VirtualHost
Se avete dei server LAMP, può succedere di avere la necessità di usare più versioni di PHP sulla stessa macchina. Ad esempio ci potrebbero essere applicazioni che richiedono la versione di PHP 5.6 che devono convivere con applicazioni che richiedono la versione 7.2
Nel mio caso ho fatto una installazione di prova su una macchina Ubuntu server 18.04 con installazione LAMP standard presente nella mia rete casalinga
Per fare i test servono 2 url per provare le differenti versioni. Nella installazione di test ho aggiunto alla mia macchina le url che mi servivano nel file hosts con:
$ https://wiki.pnlug.it
ed ho aggiunto queste righe:
192.168.0.102 cslx 192.168.0.102 test.cslx
se invece la macchina di test è esposta ad internet, si dovranno configurare opportunamente i dns.
Switch tra versioni
alcuni riferimenti:
https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu
https://askubuntu.com/questions/109404/how-do-i-install-different-upgrade-or-downgrade-php-version-in-still-supported
https://tecadmin.net/switch-between-multiple-php-version-on-ubuntu/
https://www.linuxbabe.com/ubuntu/php-multiple-versions-ubuntu-16-04-17-10
Prima di tutto installiamo più versioni di PHP nella macchina e proviamo ad usarle alternativamente.
Per installare più versione di php si installa il PPA di PHP:
$ apt install software-properties-common $ add-apt-repository ppa:ondrej/php $ apt update && apt upgrade
Poi si installa la seconda versione di PHP e si caricano un po’ di moduli
$ apt-get install php5.6 $ apt install php5.6-zip php5.6-mbstring php5.6-bz2 php5.6-xml php5.6-sqlite3 \ php5.6-readline php5.6-opcache php5.6-mysql php5.6-json php5.6-gd php5.6-curl php5.6-cli php5.6-common
e si fa lo switch con:
$ a2dismod php7.2 $ a2enmod php5.6 $ service apache2 restart
per fare le prove scriviamo due pagine di test con:
$ echo "<h1>cslx</h1> <?php phpinfo(); ?>" > /var/www/html/info.php $ mkdir /var/www/html/test $ echo "<h1>test.cslx</h1> <?php phpinfo(); ?>" > /var/www/html/test/info.php
si puo testare chiamando http://cslx/info.php per il momento anche http://test.cslx/info.php risponde alla stessa pagina perché non abbiamo ancora abilitato il virtaulhost.
se abbiamo fatto tutto bene ora dovrebbe essere attiva la versione 5.6 di PHP, per tornare alla 7.2 possiamo invertire i comandi a2dismod e a2enmod per fare tutti i test necessari ricordando sempre di abilitare le modifiche con:
$ service apache2 restart
Se in precedenza abbiamo installato PhpMyAdmin, possiamo provare ed anch’esso funziona perché supporta php5.6, così con l'occasione controlliamo che funzioni anche tutti i moduli di mysql.
Usiamo i comandi php command line come ad esempio php o phar, possiamo impostare i comandi di default con:
$ update-alternatives --set php /usr/bin/php5.6 $ update-alternatives --set phar /usr/bin/phar5.6
versioni multiple via fastcgi
riferimenti:
https://tecadmin.net/install-apache-php-fpm-ubuntu/
https://askubuntu.com/questions/1029564/php-7-2-fastcgi-doesnt-work-on-ubuntu-18-04-server
La macchina con la configurazione switch può essere utile se pianifichiamo di usare solo una versione di PHP, ma se vogliamo attivare un virtualhost potrebbe essere utile far convivere nella stessa installazione più versioni di PHP.
Per fare questo è necessario che una delle due versioni di php venga attivata via fastcgi. Nel mio caso ho deciso di usare php 5.6 come standard e php 7.2 come versione fastcgi.
ora instaliamo e configuriamo il fastcgi
$ apt install php7.2-fpm $ systemctl status php7.2-fpm $ a2enmod proxy_fcgi $ systemctl restart apache2
Questo ci rende disponibile la versione fastcgi di php 7.2, ora dobbiamo attivare un virtualhost per far convivere le due versioni.
scriviamo il file virtualhost per la url http://test.cslx
$ nano /etc/apache2/sites-available/test.cslx.conf
e copiamo questo testo:
<VirtualHost *:80> ServerName test.cslx ServerAdmin webmaster@localhost DocumentRoot /var/www/html/test <Directory /var/www/html/test> Options -Indexes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
attiviamo il virtual host con
$ a2ensite test.cslx.conf $ systemctl reload apache2
a questo punto alle http://cslx/info.php e http://test.cslx/info.php rispondono due versioni di php diverse.
Considerazioni finali
Non ho provato, ma questa tecnica dovrebbe funzionare anche con più di due versioni di PHP il solo vincolo e che possiamo avere solo una versione senza CGI mentre tutte le altre dovranno avere nel virtual host la configurazione appropriata di fastcgi.
Ho trovato questa pagina:
https://blog.layershift.com/which-php-mode-apache-vs-cgi-vs-fastcgi/
Che può aiutare a scegliere la versione da usare con il modulo apache e quali con fastcgi. Il mio orientamento è quello di usare di default il modulo apache e di usare fastcgi quando serve. Questo perché l’installazione è più semplice essendo quella di default del sistema operativo, ed eventualmente usare fastcgi solo quando ci sono motivi per farlo.