Tutorial

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

ApachePHPLAMP StackOpen SourceUbuntu 18.04

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 7.0 et 7.2, ainsi que PHP-FPM et plusieurs extensions supplémentaires. Mais pour ce faire, vous devrez d'abord ajouter le référentiel Ondrej PHP à votre système.

Exécutez la commande apt-get pour installer un software-properties-common:

  • sudo apt-get install software-properties-common -y

Le package software-properties-common fournit l'utilitaire de ligne de commande apt-add-repository, que vous utiliserez pour ajouter le référentiel de dépôts personnels de paquets logiciels (PPA pour Personal package Archive, ) ondrej/php.

Ajoutez maintenant le référentiel ondrej/php à votre système. Le référentiel PPA ondrej/php disposera de versions de PHP plus à jour que les référentiels officiels Ubuntu, et il vous permettra également d'installer plusieurs versions de PHP dans le même système :

  • sudo add-apt-repository ppa:ondrej/php

Mettez le référentiel à jour :

  • sudo apt-get update -y

Ensuite, installez php7.0, php7.0-fpm, php7.0-mysql, libapache2-mod-php7.0 et libapache2-mod-fcgid avec les commandes suivantes

  • sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y
  • php7.0 est un meta package utilisée pour exécuter des applications PHP.
  • php7.0-fpm fournit l'interprète Fast Process Manager qui fonctionne comme démon et reçoit des requêtes Fast/CGI.
  • php7.0-mysql connecte PHP à la base de données MySQL.
  • libapahce2-mod-php7.0 fournit le module PHP pour le serveur Apache.
  • libapache2-mod-fcgid contient un mod_fcgid qui lance un certain nombre d'instances de programme CGI pour traiter les requêtes simultanées.

Repérez maintenant le processus pour la version PHP 7.2. Installez php7.2, php7.2-fpm, php7.2-mysql, et libapache2-mod-php7.2 :

  • sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 -y

Après avoir installé les deux versions PHP, lancez le service php7.0-fpm

  • sudo systemctl start php7.0-fpm

Ensuite, vérifiez l'état du service php7.0-fpm

  • sudo systemctl status php7.0-fpm

Vous verrez la sortie suivante :

Output
● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-03-29 12:53:23 UTC; 15s ago Docs: man:php-fpm7.0(8) Process: 20961 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited, Process: 20979 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exite Main PID: 20963 (php-fpm7.0) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1150) CGroup: /system.slice/php7.0-fpm.service ├─20963 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf) ├─20977 php-fpm: pool www └─20978 php-fpm: pool www

En répétant ce processus, lancez maintenant le service php7.2-fpm :

  • sudo systemctl start php7.2-fpm

Et vérifiez l'état du service php7.2-fpm :

  • sudo systemctl status php7.2-fpm

Vous verrez la sortie suivante :

Output
● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-03-29 12:53:22 UTC; 45s ago Docs: man:php-fpm7.2(8) Main PID: 20897 (php-fpm7.2) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1150) CGroup: /system.slice/php7.2-fpm.service ├─20897 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) ├─20909 php-fpm: pool www └─20910 php-fpm: pool www

Et enfin, vous devez activer plusieurs modules pour que votre service Apache2 puisse fonctionner avec plusieurs versions PHP :

  • sudo a2enmod actions fcgid alias proxy_fcgi
  • actions est utilisé pour exécuter des scripts CGI sur la base de type de média ou de méthode de requête.

  • fcgid est une alternative haute performance à mod_cgi qui démarre un nombre suffisant d'instances du programme CGI pour traiter des requêtes simultanées.

  • alias permet le mappage des différentes parties du système de fichiers hôte dans l'arborescence du document, et la redirection des URL.

  • proxy_fcgi permet à Apache de transmettre des requêtes à PHP-FPM.

Redémarrez maintenant le service Apache pour appliquer vos modifications :

  • sudo systemctl restart apache2

À 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 Apache fonctionne comme un utilisateur www-data et un groupe www-data. Pour vous assurer que vous avez la propriété et les permissions correctes des répertoires root de votre site web, exécutez les commandes suivantes :

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

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 nano /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 devrait maintenant disposer des répertoires racine de 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. Au lieu de modifier le fichier de configuration par défaut situé à /etc/apache2/sites-available/000-default.conf, vous allez en créer deux nouveaux dans le répertoire /etc/apache2/sites-available/.

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 php7.0 :

  • sudo nano /etc/apache2/sites-available/site1.your_domain.conf

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

/etc/apache2/sites-available/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php

     <Directory /var/www/site1.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
      SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
</VirtualHost>

Dans ce fichier, vous avez mis à jour le DocumentRoot dans votre nouveau répertoire et le ServerAdmin dans un e-mail auquel l'administrateur du site votre_domaine peut accéder. Vous avez également mis à jour ServerName, qui établit le domaine de base pour cette configuration d'hôte virtuel, et vous avez ajouté une directive SetHandler pour exécuter PHP en tant que serveur de processus fastCGI

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 php7.2

  • sudo nano /etc/apache2/sites-available/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 et la version PHP correspondent à vos informations uniques :

/etc/apache2/sites-available/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php  

     <Directory /var/www/site2.your_domain>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    <FilesMatch \.php$>
      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
      SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>

     ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/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 toute erreur de syntaxe :

  • sudo apachectl configtest

Vous verrez la sortie suivante :

Output
Syntax OK

Ensuite, activez les deux fichiers de configuration d'hôte virtuel :

  • sudo a2ensite site1.your_domain
  • sudo a2ensite site2.your_domain

Désactivez maintenant le site par défaut, puisque vous n'en aurez pas besoin :

  • sudo a2dissite 000-default.conf

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

  • sudo systemctl restart apache2

Maintenant que vous avez configuré Apache pour servir chaque site, vous allez les tester 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 aux utilisateurs non autorisés, ils constituent une menace de sécurité. Pour supprimer les deux fichiers, exécutez les commandes suivantes :

  • 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 Ubuntu 18.04 qui gère deux sites web avec deux versions PHP différentes. 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 pouvez envisager d'explorer les fonctionnalités les plus avancées de PHP-FPM, comme son processus de spawning adaptatif ou la façon dont il peut enregistrer sdtout et stderr. Sinon, vous pouvez maintenant 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.

Creative Commons License