Tutorial

Comment exécuter plusieurs Versions PHP sur un serveur en utilisant Apache et PHP-FPM sur CentOS 7

CentOSPHPLAMP Stack

L'auteur a choisi le COVID-19 Relief Fund pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Le serveur web Apache utilise des hôtes virtuels pour gérer plusieurs domaines sur une seule instance. De même, PHP-FPM utilise un démon pour gérer plusieurs versions PHP sur une seule instance. Vous pouvez utiliser ensemble Apache et PHP-FPM pour héberger plusieurs applications Web PHP, chacune utilisant une version différente de PHP, toutes sur le même serveur, et toutes en même temps. C'est utile car différentes applications peuvent nécessiter différentes versions de PHP, mais certaines piles de serveurs, telles qu'une pile LAMP régulièrement configurée, ne peuvent gérer qu'une seule version. Combiner Apache avec PHP-FPM est également une solution plus économique que d'héberger chaque application sur sa propre instance.

PHP-FPM offre également des options de configuration pour la journalisation stderr et stdout, les redémarrages d'urgence et le lancement de processus adaptatifs, ce qui est utile pour les sites très chargés. En fait, l'utilisation d'Apache avec PHP-FPM est l'une des meilleures piles pour héberger des applications PHP, surtout en matière de performances.

Dans ce tutoriel, vous allez configurer deux sites PHP sur une seule instance. Chaque site utilisera son propre domaine, et chaque domaine déploiera sa propre version de PHP. Le premier, site1.your_domain, déploiera PHP 7.0. La deuxième, site2.your_domain, déploiera PHP 7.2.

Conditions préalables

Étape 1 - Installation des Versions PHP 7.0 et 7.2 avec PHP-FPM

Une fois les conditions préalables remplies, vous allez maintenant installer les versions PHP 7.0 et 7.2. Le référentiel SCL (Collections de logiciels) maintient de nombreuses versions de la pile PHP pour le système CentOS 7. Si vous avez besoin de la version la plus récente de PHP et qu'elle n'est pas disponible sur SCL, consultez plutôt le PPA (personal package archive) de remi.

Commencez par installer le référentiel SCL sur votre système :

  • sudo yum install centos-release-scl -y

Voyons d'abord quelles versions de PHP 7 sont disponibles sur SCL :

  • sudo yum list rh-php7[0-9].x86_64

Vous verrez une sortie de ce type :

Output
Available Packages rh-php70.x86_64 2.3-1.el7 centos-sclo-rh rh-php71.x86_64 1-1.el7 centos-sclo-rh rh-php72.x86_64 1-2.el7 centos-sclo-rh rh-php73.x86_64 1-1.el7 centos-sclo-rh

Vous verrez que la version la plus récente, PHP 7.3, est également disponible. Pour nos exemples, nous allons toutefois installer les versions 7.0 et 7.2.

Commençons par la version la plus ancienne. Installez rh-php70 et rh-php70-php-fpm :

  • sudo yum install rh-php70 rh-php70-php-fpm -y
  • rh-php70 est un metapackage qui exécute des applications PHP.
  • rh-php70-php-fpm fournit l'interpréteur Fast Process Manager qui fonctionne comme démon et reçoit des requêtes Fast/CGI.

Repérez maintenant le processus pour la version PHP 7.2. Installez rh-php72 et rh-php72-php-fpm.

  • sudo yum install rh-php72 rh-php72-php-fpm -y

Ensuite, exécutez les commandes suivantes pour commencer à utiliser les deux collections logicielles :

  • sudo scl enable rh-php70 bash
  • sudo scl enable rh-php72 bash

Par défaut, les deux versions de PHP sont à l'écoute sur le port 9000. Mais dans ce tutoriel, nous voulons exécuter deux versions simultanément. Par conséquent, nous allons désigner deux nouveaux ports :

Pour ce faire, vous pouvez ouvrir /etc/opt/rh/rh-php70/php-fpm.d/www.conf dans votre éditeur de texte préféré et changer chaque apparence de 9000 à 9002. Ensuite, enregistrez et fermez le fichier et répétez le processus pour /etc/opt/rh/rh-php72/php-fpm.d/www.conf, ne remplacez maintenant 9000 que par 9003. Vous pouvez en outre utiliser ces deux commandes sed pour faire les remplaçants :

  • sudo sed -i 's/:9000/:9002/' /etc/opt/rh/rh-php70/php-fpm.d/www.conf
  • sudo sed -i 's/:9000/:9003/' /etc/opt/rh/rh-php72/php-fpm.d/www.conf

Vous avez maintenant désigné un port dédié pour chacun de vos services PHP. Cependant, avant que ces modifications ne fonctionnent, vous devez ajouter les ports à votre configuration SELinux.

CentOS 7. Vous devez ajouter vos nouveaux ports 9002 et 9003 à votre base de données SELinux et les attribuer à vos services httpd, sinon vos applications ne fonctionneront pas. Utilisez la commande semanage pour effectuer cette tâche :

  • sudo semanage port -a -t http_port_t -p tcp 9002
  • sudo semanage port -a -t http_port_t -p tcp 9003

Le drapeau -a spécifie que vous ajoutez un objet à la base de données. Le drapeau -t spécifie le type d'objet, qui dans ce cas est http_port_t​​​. Et le drapeau -p désigne le protocole tcp. Vous pouvez en apprendre davantage sur SELinux et la commande semanage dans ce tutoriel, ou en consultant la documentation officielle SELinux.

Maintenant, vous êtes prêt à démarrer et à activer vos services PHP. Commencez par votre service rh-php70-php-fpm et activez-le au démarrage :

  • sudo systemctl start rh-php70-php-fpm
  • sudo systemctl enable rh-php70-php-fpm

Ensuite, vérifiez l'état de votre service rh-php70-php-fpm

  • sudo systemctl status rh-php70-php-fpm

Vous verrez une sortie de ce type :

Output
● rh-php70-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago Main PID: 1852 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php70-php-fpm.service ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf) ├─1853 php-fpm: pool www ├─1854 php-fpm: pool www ├─1855 php-fpm: pool www ├─1856 php-fpm: pool www └─1857 php-fpm: pool www Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

En répétant ce processus, démarrez le service rh-php72-php-fpm et activez-le au démarrage :

  • sudo systemctl start rh-php72-php-fpm
  • sudo systemctl enable rh-php72-php-fpm

Ensuite, vérifiez l'état de votre service rh-php72-php-fpm

  • sudo systemctl status rh-php72-php-fpm

Vous verrez une autre sortie comme celle-ci :

Output
● rh-php72-php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago Main PID: 1876 (php-fpm) Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/rh-php72-php-fpm.service ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf) ├─1877 php-fpm: pool www ├─1878 php-fpm: pool www ├─1879 php-fpm: pool www ├─1880 php-fpm: pool www └─1881 php-fpm: pool www Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager... Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

À ce stade, vous avez installé deux versions PHP sur votre serveur. Ensuite, vous allez créer une structure de répertoire pour chaque site web que vous voulez déployer.

Étape 2 — Création de structures répertoire pour les deux sites Web

Dans cette section, vous créerez un répertoire root de document et une page index pour chacun de vos deux sites Web.

Tout d'abord, créez des répertoires root de documents à la fois pour site1.your_domain et site2.your_domain

  • sudo mkdir /var/www/site1.your_domain
  • sudo mkdir /var/www/site2.your_domain

Par défaut, le serveur web Apache fonctionne comme un utilisateur apache et un groupe apache. Donc /var/www/ et tous ses fichiers et sous-répertoires devraient également leur appartenir. Exécutez les commandes suivantes pour vérifier la propriété et les autorisations correctes des répertoires racines de votre site web :

  • sudo chown -R apache:apache /var/www/site1.your_domain
  • sudo chown -R apache:apache /var/www/site2.your_domain
  • sudo chmod -R 755 /var/www/site1.your_domain
  • sudo chmod -R 755 /var/www/site2.your_domain

La commande chown change la propriété des deux répertoires de votre site web pour l'utilisateur apache et le groupe apache. La commande chmod modifie les permissions associées à cet utilisateur et au groupe, ainsi qu'à d'autres.

Ensuite, vous allez créer un fichier info.php à l'intérieur du répertoire root de chaque site Web. Cela affichera les informations de version PHP de chaque site Web. Commencez avec site1

  • sudo vi /var/www/site1.your_domain/info.php

Ajoutez la ligne suivante :

/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>

Enregistrez et fermez le fichier. Copiez maintenant le fichier info.php que vous avez créé sur site2

  • sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

Votre serveur web dispose maintenant des répertoires racine des documents dont chaque site a besoin pour fournir des données aux visiteurs. Ensuite, vous allez configurer votre serveur web Apache pour qu'il fonctionne avec deux versions PHP différentes.

Étape 3 — Configuration d'Apache pour les deux sites Web

Dans cette section, vous allez créer deux fichiers de configuration d'hôte virtuel. Cela permettra à vos deux sites web de fonctionner simultanément avec deux versions PHP différentes.

Pour qu'Apache puisse servir ce contenu, il est nécessaire de créer un fichier d'hôte virtuel avec les directives correctes. Vous allez créer deux nouveaux fichiers de configuration d'hôte virtuel dans le répertoire /etc/httpd/conf.d/.

Commencez par créer un nouveau fichier de configuration d'hôte virtuel pour le site Web site1.your_domain. Ici, vous allez indiquer à Apache de rendre le contenu en utilisant PHP 7.0 :

  • sudo vi /etc/httpd/conf.d/site1.your_domain.conf

Ajoutez le contenu suivant. Assurez-vous le chemin du répertoire du site Web, le nom du serveur, le port et la version PHP correspondent à votre configuration :

/etc/httpd/conf.d/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9002
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php70-fcgi .php
     Action php70-fcgi /cgi-bin/php70.fcgi
     ErrorLog /var/log/httpd/site1.your_domain_error.log
     CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>

Pour DocumentRoot, vous spécifiez le chemin du répertoire racine de votre site web. Pour ServerAdmin, vous ajoutez un courriel auquel l'administrateur du site your_domain peut accéder. Pour ServerName, vous ajoutez l'url de votre premier sous-domaine. Pour SetHandler, vous spécifiez le port 9002. Les autres directives configurent également votre service pour déployer PHP 7.0.

Enregistrez et fermez le fichier.

Ensuite, créez un nouveau fichier de configuration d'hôte virtuel pour le site Web site2.your_domain. Vous allez spécifier ce sous domaine pour déployer PHP 7.2 :

  • sudo vi /etc/httpd/conf.d/site2.your_domain.conf

Ajoutez le contenu suivant. Là encore, assurez-vous que le chemin d'accès au répertoire du site web, le nom du serveur, le port et la version PHP correspondent à vos informations uniques :

/etc/httpd/conf.d/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9003
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php72-fcgi .php
     Action php72-fcgi /cgi-bin/php72.fcgi
     ErrorLog /var/log/httpd/site2.your_domain_error.log
     CustomLog /var/log/httpd/site2.your_domain_access.log combined
</VirtualHost>

Enregistrez et fermez le fichier lorsque vous avez terminé. Vérifiez ensuite le fichier de configuration Apache pour détecter toute erreur de syntaxe :

  • sudo apachectl configtest

Vous verrez une sortie d'impression Syntax OK :

Output
  • Syntax OK

Enfin, redémarrez le service Apache pour implémenter vos changements :

  • sudo systemctl restart httpd

Maintenant que vous avez configuré Apache pour servir chaque site, vous allez tester les sites pour vous assurer que les versions PHP adéquates tournent.

Étape 4 — Test des deux sites Web

À ce stade, vous avez configuré deux sites web pour exécuter deux versions différentes de PHP. Testez maintenant les résultats.

Ouvrez votre navigateur web et consultez les deux sites http://site1.your_domain et http://site2.your_domain Vous verrez deux pages qui ressemblent à ceci :

PHP 7.0 info page PHP 7.2 info page

Notez les titres. La première page indique que site1.your_domain a déployé PHP version 7.0. La deuxième indique que site2.your_domain a déployé PHP version 7.2.

Maintenant que vous avez testé vos sites, supprimez les fichiers info.php. Étant donné qu'ils contiennent des informations sensibles sur votre serveur et sont accessibles a des utilisateurs non autorisés, ils constituent une faille de sécurité. Supprimez les fichiers :

  • sudo rm -rf /var/www/site1.your_domain/info.php
  • sudo rm -rf /var/www/site2.your_domain/info.php

Vous disposez désormais d'un seul serveur CentOS 7 qui gère deux sites web avec deux versions différentes de PHP. Cela dit, PHP-FPM n'est pas limité à cette seule application.

Conclusion

Vous avez maintenant combiné des hôtes virtuels et PHP-FPM pour servir plusieurs sites web et plusieurs versions de PHP sur un seul serveur. La seule limite pratique sur le nombre de sites PHP et les versions PHP que votre service Apache peut gérer est la puissance de traitement de votre instance.

À partir de là, vous pourriez envisager d’explorer les fonctionnalités plus avancées de PHP-FPM, comme son processus de spawning adaptatif ou la façon dont il peut enregistrer sdtout et stderr.  Par ailleurs, vous pourriez désormais sécuriser vos sites web. Pour ce faire, vous pouvez suivre notre tutoriel sur comment sécuriser vos sites avec des certificats TLS/SSL gratuits de Let’s Encrypt.

0 Comments

Creative Commons License