Voici un article technique détaillé sur la cohabitation de plusieurs versions de PHP-FPM (par exemple : 7.4, 8.1 et 8.3/8.4) sur un serveur Apache (Debian/Ubuntu), en utilisant des configurations distinctes par VirtualHost Apache. Ce type de configuration est utile pour héberger des applications PHP ayant des dépendances sur des versions spécifiques.
Objectif
-
Héberger plusieurs sites web sur un même serveur Apache.
-
Chaque site utilise une version différente de PHP (par exemple PHP 7.4, 8.1, 8.3, 8.4).
-
Utiliser PHP-FPM (FastCGI Process Manager) pour chaque version.
-
Définir la version PHP par VirtualHost Apache.
1. Prérequis
-
Système Debian 11/12 ou Ubuntu 20.04/22.04/24.04
-
Droits
sudo/root -
Apache installé :
sudo apt install apache2
📦 2. Installation des versions PHP et modules nécessaires
Étape 1 : Ajouter le PPA (Ubuntu) ou les dépôts Sury (Debian)
Pour Debian :
sudo apt install lsb-release apt-transport-https ca-certificates gnupg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | \
sudo tee /etc/apt/sources.list.d/php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/php.gpg
sudo apt update
Étape 2 : Installer plusieurs versions de PHP-FPM
sudo apt install php7.4 php7.4-fpm php7.4-cli php7.4-mysql php7.4-curl php7.4-xml php7.4-mbstring
sudo apt install php8.1 php8.1-fpm php8.1-cli php8.1-mysql php8.1-curl php8.1-xml php8.1-mbstring
sudo apt install php8.3 php8.3-fpm php8.3-cli php8.3-mysql php8.3-curl php8.3-xml php8.3-mbstring
Remplacez
8.3par8.4si disponible à la date d'installation.
Étape 3 : Démarrer et activer les services PHP-FPM
sudo systemctl enable --now php7.4-fpm
sudo systemctl enable --now php8.1-fpm
sudo systemctl enable --now php8.3-fpm
🌐 3. Configuration d’Apache avec proxy_fcgi
Étape 1 : Activer les modules nécessaires
sudo a2enmod proxy_fcgi setenvif
sudo a2enmod actions
sudo systemctl restart apache2
🏗️ 4. Création de VirtualHosts avec versions PHP séparées
Exemple : trois sites web avec différentes versions de PHP
-
site74.example.com→ PHP 7.4 -
site81.example.com→ PHP 8.1 -
site83.example.com→ PHP 8.3
🧾 VirtualHost pour PHP 7.4
<VirtualHost *:80>
ServerName site74.example.com
DocumentRoot /var/www/site74
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site74_error.log
CustomLog ${APACHE_LOG_DIR}/site74_access.log combined
</VirtualHost>
🧾 VirtualHost pour PHP 8.1
<VirtualHost *:80>
ServerName site81.example.com
DocumentRoot /var/www/site81
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site81_error.log
CustomLog ${APACHE_LOG_DIR}/site81_access.log combined
</VirtualHost>
🧾 VirtualHost pour PHP 8.3 (ou 8.4)
<VirtualHost *:80>
ServerName site83.example.com
DocumentRoot /var/www/site83
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site83_error.log
CustomLog ${APACHE_LOG_DIR}/site83_access.log combined
</VirtualHost>
🚀 Activer les sites et recharger Apache
sudo a2ensite site74.conf
sudo a2ensite site81.conf
sudo a2ensite site83.conf
sudo systemctl reload apache2
✅ 5. Vérification
Placer un info.php dans chaque DocumentRoot :
<?php phpinfo(); ?>
-
Naviguez vers :
→ Vérifiez que chaque site utilise la bonne version de PHP.
🧩 6. Ajustements et sécurité
🔐 Permissions
Assurez-vous que les sockets /run/php/phpX.X-fpm.sock sont accessibles par l’utilisateur Apache (www-data par défaut).
⚙️ Tuning PHP-FPM (par version)
Modifier les fichiers :
-
/etc/php/7.4/fpm/pool.d/www.conf -
/etc/php/8.1/fpm/pool.d/www.conf -
/etc/php/8.3/fpm/pool.d/www.conf
Exemple pour modifier le port/socket, mémoire, limites de process, etc.
🧠 Résumé
| Site / VHost | Version PHP | Fichier Socket |
|---|---|---|
| site74.example.com | 7.4 | /run/php/php7.4-fpm.sock |
| site81.example.com | 8.1 | /run/php/php8.1-fpm.sock |
| site83.example.com | 8.3 ou 8.4 | /run/php/php8.3-fpm.sock ou 8.4 |
🧪 Bonus : script bash pour vérifier les sockets PHP-FPM
#!/bin/bash
for v in 7.4 8.1 8.3 8.4; do
sock="/run/php/php${v}-fpm.sock"
if [ -S "$sock" ]; then
echo "PHP-FPM $v is active and listening on $sock"
else
echo "PHP-FPM $v socket not found"
fi
done
🧾 Conclusion
Cette configuration permet de faire cohabiter plusieurs applications avec des dépendances PHP différentes, tout en maintenant un serveur Apache unifié et des pools PHP-FPM indépendants.