Plusieurs versions PHP-FPM sur un serveur Apache Debian/Ubuntu

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.3 par 8.4 si 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(); ?>

→ 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.