Aujourd’hui, la plupart des sites web ne sont plus constitués de simples pages HTML, mais sont de véritables applications interactives sur lesquelles vous pouvez ajouter ou modifier du contenu. Un des langages les plus utilisés pour créer ces sites dynamiques est PHP. Beaucoup d’applications très populaires telles que le moteur de blog WordPress utilisent ce langage, et vous aurez donc besoin de savoir l’installer et le configurer pour profiter de toutes ces applications.
De manière générale, il y a deux manières d’exécuter des programmes avec Apache :
sous forme d’un module intégré à Apache, ce qui permet aux processus Apache de gérer eux-mêmes l’exécution du programme ;
sous forme d’un script CGI. Dans ce cas, Apache délègue l’exécution du programme à un processus tiers.
PHP n’échappe pas à la règle, et je vais donc vous présenter ces deux manières d’installer PHP.
Installez PHP sous forme de module Apache
La manière la plus classique et la plus simple d’installer PHP est de l’installer sous forme d’un module Apache. Pour cela, il vous suffit d’installer le module libapache2-mod-php
:
$ sudo apt install libapache2-mod-php
PHP est alors installé, ainsi que le module mod-php
qui permet à Apache d’utiliser ce langage. Si vous lisez les informations du processus d’installation, vous verrez également que le module mpm_event
a été désactivé au profit du module mpm_prefork
. En effet, PHP n’est pas considéré comme étant “thread_safe” et si vous vous souvenez du chapitre 1, c’était une des raisons d’utiliser le module mpm_prefork
.
Pour tester l’installation de PHP sur votre système, dans le répertoire /var/www/html/www.example.com/top_secret
de votre site web, supprimez le fichier index.html
et créez le fichier index.php
contenant :
<?php phpinfo(); ?>
Après vous être authentifié, vous voyez s’afficher beaucoup d’informations sur votre système, votre configuration Apache et bien sûr votre configuration PHP.
Voyons maintenant la méthode FastCGI d’installation de PHP.
Installez PHP en tant que processus FastCGI
L’installation de PHP sous forme de processus indépendant d’Apache est une manière plus récente d’installer PHP et souvent considérée comme plus performante, en particulier pour les sites à forte charge. Cette méthode repose sur le daemon PHP-FPM vers lequel Apache redirigera toutes les requêtes qui nécessitent d’exécuter du code PHP. Vous pouvez installer ce daemon par la commande :
$ sudo apt install php-fpm
Par défaut, php-fpm n’est pas activé dans Apache, et vous verrez un message d’avertissement indiquant d’exécuter les commandes pour activer les modules et configurations suivants :
$ sudo a2enmod proxy_fcgi setenvif $ sudo a2enconf php7.4-fpm
Pour utiliser php-fpm, il vous faudra également désactiver le module Apache PHP. Puisque c’est php-fpm qui gère PHP, il n’y a plus d'interaction directe entre les threads Apache et PHP. Du coup, vous allez en profiter pour repasser au module mpm_event.
$ sudo a2dismod php7.4 mpm_prefork $ sudo a2enmod mpm_event $ sudo systemctl restart apache2
Configurez PHP
Vous trouverez la configuration de PHP dans le répertoire /etc/php/7.4
où 7.4
est votre version de PHP :
$ ls /etc/php/7.4 apache2 cli mods-available
Vous y trouverez 3 répertoires :
apache2
est la configuration utilisée par le module PHP d’Apache ;cli
est la configuration utilisée par le client en ligne de commande PHP ;mods-available
est le répertoire où sont installés tous les modules PHP.
$ ls /etc/php/7.4/apache2 conf.d php.ini
Dans le répertoire apache2
(et pareil pour cli
), vous trouverez le fichier de configuration général php.ini
et la configuration propre à chaque module dans le répertoire conf.d
.
Php-fpm fonctionne par un système de pools, un pool étant un ensemble de processus php-fpm utilisant une même configuration.
Ce qui est intéressant quand on a plusieurs sites web, c’est qu’on peut affecter un pool différent à chaque site web. Je pourrais par exemple affecter :
à mon site A un pool de 3 processus appartenant à userA ;
à mon site B un pool de 20 processus appartenant à userB.
De cette façon, je choisis si je veux allouer plus de ressources à un site plutôt qu’à un autre, ce que je ne pouvais pas faire avec le module Apache PHP. Le fait que chaque pool puisse utiliser un utilisateur différent est un atout en termes de sécurité : si le site A se fait pirater, le pirate ne pourra pas accéder aux fichiers du site B, et vice versa.
Si vous regardez le contenu de votre répertoire pool.d
, vous y trouverez seulement le fichier www.conf
. Regardons ensemble le contenu de ce fichier :
[www]
Entre crochets, se trouve le nom du pool : ici www
.
user = www-data group = www-data
Vous avez ensuite la définition de l’utilisateur et du groupe auxquels appartient votre pool. C’est important, car les fichiers de votre site doivent pouvoir être accessibles en lecture et au besoin en écriture à cet utilisateur.
Listen = /run/php/php7.4-fpm.sock
La directive Listen
définit l’interface réseau sur laquelle écoute le pool. Cette interface est utilisée pour la communication avec le serveur web. Ici, c’est un fichier socket Unix qui est utilisé, mais vous pourriez préciser une adresse IP et un port TCP. Il faut en tout cas bien noter le nom de cette interface, car vous allez devoir la reporter dans votre configuration Apache.
Il faut maintenant indiquer à Apache de transmettre les requêtes qui demandent l’exécution de code PHP à PHP-FPM. Pour cela, dans votre vhost /etc/apache2/sites-available/01-www.example.com.conf
, ajoutez la ligne suivante après la directive DocumentRoot
:
DocumentRoot /var/www/html/www.example.com ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/www.example.com/
Ici, vous utilisez la directive ProxyPassMatch
qui indique à Apache de renvoyer toutes les requêtes qui valident l’expression régulière vers l’URI indiquée. Voici le détail de l’URI :
Il ne vous reste plus qu’à recharger la configuration Apache pour prendre en compte ce changement, et vous aller admirer votre page phpinfo()
sur votre client.
En résumé
Il y a deux moyens d’exécuter PHP sur un serveur web Apache : sous forme d’un module Apache ou sous forme d’un processus externe indépendant par l’interface FastCGI.
Par l’interface fastCGI, c’est le daemon PHP-FPM qui exécute PHP.
La méthode PHP-FPM est généralement reconnue comme celle qui obtient les meilleures performances.
La méthode PHP-FPM permet également plus de personnalisation et d’isolation dans un environnement multi-sites.
Dans le prochain chapitre, vous verrez comment installer la dernière brique du système LAMP : la base de données MySQL.