In questo articolo vedremo come installare più versioni di PHP su un singolo server e come assegnare a ogni virtual host la sua versione PHP, la distribuzione Linux è Ubuntu 22.04.5.
#Installazione di più versioni PHP
Per poter installare più versioni PHP useremo il pacchetto software-properties-common che fornisce un'utilità da riga di comando add-apt-repository, quindi lanciamo da CLI
$ sudo apt-get install software-properties-common -y
successivamente aggiungiamo il repository ondrej/php che consente di installare più versioni di PHP nello stesso sistema
$ sudo add-apt-repository ppa:ondrej/php
Installiamo la versione php8.0 con
- php8.0-fpm fornisce l'interprete Fast Process Manager che viene eseguito come demone e riceve richieste Fast/CGI;
- php8.0-mysql collega PHP al database MySQL;
- libapache2-mod-php8.0 fornisce il modulo PHP per il web server Apache;
- libapache2-mod-fcgid contiene un mod_fcgid che avvia un certo numero di istanze del programma CGI per gestire richieste simultanee.
$ sudo apt-get install php8.0 php8.0-fpm php8.0-mysql libapache2-mod-php8.0 -y
installiamo anche php8.1 allo stesso modo in cui abbiamo installato php8.0
$ sudo apt-get install php8.1 php8.1-fpm php8.1-mysql libapache2-mod-php8.1 -y
per visualizzare la lista delle versioni PHP installate usare il seguente comando sudo update-alternatives --list php
$ sudo update-alternatives --list php
/usr/bin/php.default
/usr/bin/php8.0
/usr/bin/php8.1
in questo caso oltre alle versioni 8.0 e 8.1 c'è anche la versione di default.
Dopo aver installato entrambe le versioni di PHP, avviare il servizio php8.0-fpm col seguente comando
$ sudo service php8.0-fpm start
verifichiamo lo stato del servizio
$ sudo service php8.0-fpm status
* php-fpm8.0 is running
il servizio è attivo.
Ripetiamo lo stesso procedimento per php8.1-fpm, avviamo il servizio
$ sudo service php8.1-fpm start
e poi verifichiamo lo stato
$ sudo service php8.1-fpm status
* php-fpm8.1 is running
abilitiamo i moduli a2enmod actions fcgid alias proxy_fcgi in modo che il servizio apache2 possa funzionare con più versioni di PHP
$ sudo a2enmod actions fcgid alias proxy_fcgi
Enabling module actions.
Module fcgid already enabled
Module alias already enabled
Considering dependency proxy for proxy_fcgi:
Enabling module proxy.
Enabling module proxy_fcgi.
To activate the new configuration, you need to run:
service apache2 restart
e come ci viene consigliato riavviamo il servizio apache2
$ sudo service apache2 restart
* Restarting Apache httpd web server apache2 [ OK ]
A questo punto abbiamo installato due versioni di PHP sul server, il passo successivo è di creare una struttura di directory per ogni sito web.
#Creazione di strutture di directory per i siti Web
Creiamo le directory radice per due siti web mypersonaldomain1.com e mypersonaldomain2.com
$ sudo mkdir /var/www/mypersonaldomain1.com
$ sudo mkdir /var/www/mypersonaldomain2.com
controlliamo che le cartelle sono state create
$ cd /var/www/ && ls -l
drwxr-xr-x 2 user user 4096 set 28 15:07 mypersonaldomain1.com
drwxr-xr-x 2 user user 4096 set 28 15:07 mypersonaldomain2.com
Per impostazione predefinita, il web server Apache viene eseguito come utente www-data e come gruppo www-data, per assicurarci di avere la proprietà e i permessi corretti delle directory radice dei nostri siti web, eseguiamo i seguenti comandi
$ sudo chown -R www-data:www-data /var/www/mypersonaldomain1.com
$ sudo chown -R www-data:www-data /var/www/mypersonaldomain2.com
$ sudo chmod -R 755 /var/www/mypersonaldomain1.com
$ sudo chmod -R 755 /var/www/mypersonaldomain2.com
lanciamo il comando ls -l in /var/www e verifichiamo
:/var/www$ ls -l
.....
.....
drwxr-xr-x 2 www-data www-data 4096 set 28 15:07 mypersonaldomain1.com
drwxr-xr-x 2 www-data www-data 4096 set 28 15:07 mypersonaldomain2.com
successivamente creiamo un file info.php in ognuna delle directory radice, cominciamo con mypersonaldomain1.com
$ sudo nano /var/www/mypersonaldomain1.com/info.php
aggiungiamo la seguente riga
<?php phpinfo(); ?>
salviamo e chiudiamo l'editor con CTRL+X, poi Y e poi Invio.
Ora copiamo il file info.php che abbiamo creato in mypersonaldomain2.com
$ sudo cp /var/www/mypersonaldomain1.com/info.php /var/www/mypersonaldomain2.com/info.php
Configuriamo ora il server web Apache per lavorare con due diverse versioni di PHP.
#Configurazione di Apache per entrambi i siti Web
In questa sezione, creeremo due file di configurazione host virtuali, ciò consentirà ai due siti web di funzionare simultaneamente con due diverse versioni di PHP.
Per far sì che Apache possa servire il contenuto dei nostri siti web, è necessario creare un file host virtuale con le direttive corrette, invece di modificare il file di configurazione predefinito che si trova in
/etc/apache2/sites-available/000-default.conf
ne creeremo due nuovi all'interno della directory
/etc/apache2/sites-available/
Per prima cosa creiamo un nuovo file di configurazione dell'host virtuale per il sito web mypersonaldomain1.com, qui indirizzeremo Apache a eseguire il rendering del contenuto utilizzando php8.0
$ sudo nano /etc/apache2/sites-available/mypersonaldomain1.com.conf
inseriamo le seguenti direttive
/etc/apache2/sites-available/mypersonaldomain1.com.conf
<VirtualHost *:80>
ServerAdmin admin@mypersonaldomain1.com
ServerName mypersonaldomain1.com
DocumentRoot /var/www/mypersonaldomain1.com
DirectoryIndex info.php
<Directory /var/www/mypersonaldomain1.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/mypersonaldomain1.com_error.log
CustomLog ${APACHE_LOG_DIR}/mypersonaldomain1.com_access.log combined
</VirtualHost>
salvare e chiudere il file.
Successivamente, creiamo un nuovo file di configurazione dell'host virtuale per il sito web mypersonaldomain2.com, specificando questo sottodominio per distribuire php8.1
$ sudo nano /etc/apache2/sites-available/mypersonaldomain2.com.conf
aggiungiamo il seguente contenuto
/etc/apache2/sites-available/mypersonaldomain2.com.conf
<VirtualHost *:80>
ServerAdmin admin@mypersonaldomain2.com
ServerName mypersonaldomain2.com
DocumentRoot /var/www/mypersonaldomain2.com
DirectoryIndex info.php
<Directory /var/www/mypersonaldomain2.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/mypersonaldomain2.com_error.log
CustomLog ${APACHE_LOG_DIR}/mypersonaldomain2.com_access.log combined
</VirtualHost>
salviamo e chiudiamo il file.
Controlliamo il file di configurazione di Apache per eventuali errori di sintassi
$ sudo apachectl configtest
Syntax OK
Successivamente, abilitare entrambi i file di configurazione dell'host virtuale con i seguenti comandi:
$ sudo a2ensite mypersonaldomain1.com
$ sudo a2ensite mypersonaldomain2.com
disattiviamo il sito predefinito
$ sudo a2dissite 000-default.conf
Site 000-default already disabled
e riavviamo Apache
$ sudo service apache2 reload
* Reloading Apache httpd web server apache2
*
se apriamo nel browser http://mypersonaldomain1.com/info.php avremo il seguente risultato
se invece apriamo nel browser http://mypersonaldomain2.com/info.php avremo il seguente risultato