Creare un LAMP Multi-PHP su Debian 12
Creiamo un ambiente LAMP di test che supporti il Multi-PHP, ovvero la possibilità di impostare una determinata versione di PHP.
Partiamo da un LAMP base basato su Debian 12 presupponendo che l’infrastruttura Apache+MySQL+PHP sia già installata.
Installiamo i requisiti se mancano:
sudo apt -y install lsb-release apt-transport-https ca-certificates
Applichiamo la chiave GPG di SURY e aggiorniamo all’ultima versione di PHP (la 8.4 al momento che scrivo):
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update -y
sudo apt dist-upgrade -y
Per vedere le versioni disponibili vedere sul repo: https://packages.sury.org/php/pool/main/p/ oppure:
sudo apt-cache showpkg php
Controlliamo le versioni installate:
sudo update-alternatives --list php
Installiamo tutte le versioni che vogliamo:
sudo apt install -y php8.4 php8.4-mysql php8.4-xdebug php8.4-curl php8.4-gd php8.4-bcmath php8.4-xml php8.4-mbstring
sudo apt install -y php8.3 php8.3-mysql php8.3-xdebug php8.3-curl php8.3-gd php8.3-bcmath php8.3-xml php8.3-mbstring
sudo apt install -y php8.2 php8.2-mysql php8.2-xdebug php8.2-curl php8.2-gd php8.2-bcmath php8.2-xml php8.2-mbstring
sudo apt install -y php8.1 php8.1-mysql php8.1-xdebug php8.1-curl php8.1-gd php8.1-bcmath php8.1-xml php8.1-mbstring
sudo apt install -y php8.0 php8.0-mysql php8.0-xdebug php8.0-curl php8.0-gd php8.0-bcmath php8.0-xml php8.0-mbstring
sudo apt install -y php7.4 php7.4-mysql php7.4-xdebug php7.4-curl php7.4-gd php7.4-bcmath php7.4-json php7.4-xml php7.4-mbstring
sudo apt install -y php7.3 php7.3-mysql php7.3-xdebug php7.3-curl php7.3-gd php7.3-bcmath php7.3-json php7.3-xml php7.3-mbstring
sudo apt install -y php7.2 php7.2-mysql php7.2-xdebug php7.2-curl php7.2-gd php7.2-bcmath php7.2-json php7.2-xml php7.2-mbstring
sudo apt install -y php7.1 php7.1-mysql php7.1-xdebug php7.1-curl php7.1-gd php7.1-bcmath php7.1-json php7.1-xml php7.1-mbstring
sudo apt install -y php7.0 php7.0-mysql php7.0-xdebug php7.0-curl php7.0-gd php7.0-bcmath php7.0-json php7.0-xml php7.0-mbstring
sudo apt install -y php5.6 php5.6-mysql php5.6-xdebug php5.6-curl php5.6-gd php5.6-bcmath php5.6-json php5.6-xml php5.6-mbstring
Per impostare come predefinita una versione specifica:
sudo update-alternatives --set php /usr/bin/php7.4
Installiamo il gestore PHP-FPM (FastCGI Process Manager):
sudo apt install -y php-fpm
sudo apt install -y php8.4-fpm
sudo apt install -y php8.3-fpm
sudo apt install -y php8.2-fpm
sudo apt install -y php8.1-fpm
sudo apt install -y php8.0-fpm
sudo apt install -y php7.4-fpm
sudo apt install -y php7.3-fpm
sudo apt install -y php7.2-fpm
sudo apt install -y php7.1-fpm
sudo apt install -y php7.0-fpm
sudo apt install -y php5.6-fpm
Verificare che i servizi php*.*-fpm siano attivi e configurati per essere avviati al reboot.
systemctl status php8.4-fpm
...
systemctl status php5.6-fpm
Abilitare le configurazioni per Apache:
sudo a2enconf php8.4-fpm
sudo a2enconf php8.3-fpm
sudo a2enconf php8.2-fpm
sudo a2enconf php8.1-fpm
sudo a2enconf php8.0-fpm
sudo a2enconf php7.4-fpm
sudo a2enconf php7.3-fpm
sudo a2enconf php7.2-fpm
sudo a2enconf php7.1-fpm
sudo a2enconf php7.0-fpm
sudo a2enconf php5.6-fpm
sudo systemctl restart apache2
Abilitare i moduli per Apache:
sudo a2enmod proxy proxy_fcgi rewrite
sudo systemctl restart apache2
Creare una struttura base per testare il multiphp:
mkdir /var/www/multiphp.loc
mkdir /var/www/multiphp.loc/php84
...
mkdir /var/www/multiphp.loc/php56
Creare dentro ogni singola cartella il file di test index.php:
<?php
phpinfo();
Creare un host virtuale per testare le versioni:
sudo nano /etc/apache2/sites-available/multiphp.loc.conf
Aggiungere:
<VirtualHost *:80>
DocumentRoot /var/www/multiphp.loc
<Directory /var/www/multiphp.loc>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<DirectoryMatch "^/var/www/multiphp.loc/php84/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php83/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php82/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php81/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php80/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php74/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php73/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php72/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php71/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.1-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php70/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
<DirectoryMatch "^/var/www/multiphp.loc/php56/">
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
</FilesMatch>
</DirectoryMatch>
</VirtualHost>
Ho usato in accoppiata le direttive DirectoryMatch e FilesMatch per limitare l’azione di PHP-FPM solo ai file php e nelle rispettive cartelle/versioni distinguendole.
Nelle prime versioni usando Location avevo il problema che PHP-FPM gestiva tutti i tipi di file e li corrompeva tipo i CSS che venivano identificati come text/html invece che text/css e venivano bloccati.
Abilitare l’host virtuale:
sudo a2ensite multiphp.loc.conf
Ricaricare le modifiche:
sudo systemctl reload apache2
Aggiungere nel proprio file hosts il virtualhost e poi aprirlo dal browser e testare che le versioni siano diverse: