Linux, come eseguire più versioni PHP su un server utilizzando Apache e PHP-FPM

Installare più versioni PHP su un web server Apache per eseguire più siti web ognuno con la propria versione PHP.

Pubblicato da ,
Ultima modifica

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

php8.0

se invece apriamo nel browser http://mypersonaldomain2.com/info.php avremo il seguente risultato

php8.1