Apache en tant que serveur web dynamique
Introduction
Comme nous avons pu le voir précédemment, Apache est très riche en fonctionnalités, de par la grande variété de modules mise à disposition. Force est de constater qu’Apache est majoritairement utilisé comme serveur web, dans le but d’héberger des sites Internet aux contenus interactifs.
Nous aborderons dans ce chapitre différentes méthodes lui permettant d’interpréter des pages dites « dynamiques », avec les différents modules multitraitements disponibles (MPM Prefork, Worker ou Event).
Pour illustrer cela, nous allons y associer le langage PHP (Hypertext Preprocessor) ainsi que la base de données MySQL, sur une distribution Debian Linux.
Cette plate-forme logicielle est plus communément appelée LAMP (Linux Apache MySQL PHP). C’est à ce jour l’un des environnements les plus utilisés sur Internet.
Afin d’expliquer l’installation d’Apache avec les différents MPM, l’option --with-mpm= est utilisée. Ainsi, les possibilités sont :
--with-mpm=prefork
--with-mpm=worker
--with-mpm=event # par défaut
Depuis la version 2.4, il est possible de passer d’un MPM à l’autre sans avoir à recompiler Apache en utilisant l’option --enable-mpms-shared=all lors de la configuration de l’installation (commande...
PHP avec Apache en MPM Prefork
L’emploi du MPM Prefork d’Apache implique l’utilisation de PHP en tant que module d’Apache. Il s’agit de la méthode d’installation historique du couple Apache/PHP, encore parfois recommandée dans les prérequis d’applications web.
Les deux composants sont donc solidaires dans l’exécution du code, PHP faisant partie intégrante d’Apache.
1. Installation de PHP
L’installation de PHP en tant que composant d’Apache (module DSO) sous-entend l’utilisation de l’apxs (APache eXtenSion tool). Nous allons effectuer cette installation sur une distribution Debian Linux, dans sa toute dernière version (7.8) à la date de rédaction cet ouvrage.
a. Installation avec le gestionnaire de paquets Debian
Comme pour toute installation sous Debian Linux, nous pouvons tout simplement utiliser l’outil apt-get de la distribution, qui prendra en charge l’ensemble des dépendances nécessaires au bon fonctionnement.
À la date de rédaction, les versions disponibles sur cette distribution sont :
-
Apache 2.2.22-13
-
PHP 5.4.36-0+deb7u3
root@vm-debian-eni:~# apt-cache policy apache2
apache2:
Installé : (aucun)
Candidat : 2.2.22-13+deb7u4
Table de version :
2.2.22-13+deb7u4 0
500 http://ftp.fr.debian.org/debian/ wheezy/main amd64
Packages
2.2.22-13+deb7u3 0
500 http://security.debian.org/ wheezy/updates/main amd64
Packages
root@vm-debian-eni:~# apt-cache policy php5
php5:
Installé : (aucun)
Candidat : 5.4.36-0+deb7u3
Table de version :
5.4.36-0+deb7u3 0
500 http://security.debian.org/ wheezy/updates/main amd64
Packages
5.4.36-0+deb7u1 0
500 http://ftp.fr.debian.org/debian/ wheezy/main amd64
Packages
Ainsi, pour installer le paquet PHP5 :
apt-get install php5
Il est intéressant de noter que :
-
les packages apache2, apache2-bin et apache2-data vont être désinstallés.
-
de nouveaux packages vont être installés : apache2-mpm-prefork, apache2.2-bin, apache2.2-common, libapache2-mod-php5...
PHP avec Apache en MPM Worker
L’utilisation d’Apache en multithread avec PHP a longtemps été considérée comme instable et non conseillée à la production. Mais depuis les dernières versions et l’apparition de modules tels que mod_fcgid (FastCGI daemon), les performances et la stabilité sont au rendez-vous.
Souvent comparé au mod_fastcgi, mod_fcgid s’interface donc à php-cgi via le mécanisme FastCGI.
FastCGI est très semblable à CGI. Il s’agit en fait d’une amélioration de ce dernier apportant une notion de gestion de processus et permettant de pallier la problématique d’avoir un processus CGI par requête.
Ainsi, les requêtes en provenance du serveur Apache sont distribuées aux processus CGI, directement gérés par le mécanisme FastCGI en charge de leur cycle de vie. La différence la plus marquante est donc qu’en FastCGI, les processus du serveur Apache et ceux de l’application sont séparés.
Le rôle d’Apache est donc ramené à afficher le résultat du traitement de FastCGI. Il ne consiste plus à effectuer lui-même l’interprétation du code PHP comme c’est le cas avec le module mod_php.
Afin d’illustrer la mise en œuvre de cet environnement, nous allons devoir :
-
Réinstaller PHP avec le support CGI,
-
Réinstaller Apache en MPM Worker,
-
Installer le module Apache mod_fcgid.
Nous utiliserons les sources d’Apache et PHP dans leur version respective 2.4.12 et 5.5.21, dernières versions stables à la date de rédaction de cet ouvrage.
1. Installation de PHP
La méthode de compilation de PHP ne change pas. Seules quelques options changent pour correspondre au besoin : utiliser PHP en FastCGI.
L’organisation des arborescences est la suivante :
-
/opt/src : répertoire contenant les sources,
-
/opt/prod/php55-cgi: répertoire d’installation de PHP.
Étant donné que nous utilisons les mêmes sources que pour notre dernière compilation, nous allons effectuer un make clean afin de supprimer les fichiers générés précédemment :
marty@vm-debian-eni:/opt/src/php-5.5.21$ make clean
Nous allons à présent relancer...
PHP avec Apache en MPM Event
1. Installation de PHP-FPM
Disponible depuis la version 5.3.3 de PHP, PHP-FPM (FastCGI Process Manager) est une alternative à PHP FastCGI particulièrement adaptée pour des environnements fortement sollicités.
Il permet entre autres :
-
une gestion avancée des processus grâce aux arrêts/démarrages « graceful »,
-
la création dynamique des processus,
-
la possibilité de restriction basée sur l’adresse IP à l’origine des requêtes,
-
la mise à disposition de statistiques,
-
la possibilité de créer de nouveaux processus sous différents uid/gid, avec un « chroot » des environnements PHP dédiés par projet.
a. Distribution Linux Ubuntu/Debian
La distribution Debian/Linux met à disposition depuis son gestionnaire de packages php5-fpm, dans sa version 5.4.36-0+deb7u1.
Il est alors possible de l’installer avec l’utilitaire apt :
marty@vm-compilation-eni:~$ sudo apt-get install php5-fpm
Le package s’installe dans le répertoire /etc/php5/fpm :
marty@vm-compilation-eni:~$ sudo tree /etc/php5/fpm/
/etc/php5/fpm/
├── conf.d -> ../conf.d
├── php-fpm.conf
├── php.ini
└── pool.d
└── www.conf
2 directories, 3 files
Le fichier www.conf présent dans le répertoire pool.d présente une configuration par défaut.
Éditez ce fichier et remplacez la ligne :
listen = /var/run/php5-fpm.sock
par :
listen = 127.0.0.1:9000
Cela permet la communication avec php-fpm par le protocole TCP, sur le port 9000.
Il est nécessaire de relancer le service pour que les modifications soient prises en compte :
marty@vm-compilation-eni:~$ sudo service php5-fpm restart
[ ok ] Restarting PHP5 FastCGI Process Manager: php5-fpm.
b. Installation depuis les sources
Pour l’installation depuis les sources, il faut se rendre dans le répertoire des sources de PHP, téléchargé depuis le site http://php.net/.
cd /opt/src/ php-5.5.21/
La configuration de la compilation consiste à :
-
activer l’extension FPM avec l’argument --enable-fpm.
-
désactiver l’utilisation...
Installation de MySQL
MySQL est un système de gestion de bases de données relationnelles (SGBDR). Il est fréquemment associé au langage PHP, notamment dans les plates-formes appelées LAMP (Linux Apache MySQL PHP).
1. Distribution Ubuntu et Debian/Linux
La distribution Debian met à disposition la version 5.5.41 de MySQL Server depuis le gestionnaire de packages :
marty@vm-compilation-eni:~$ sudo apt-cache show mysql-server-5.5
Package: mysql-server-5.5
Source: mysql-5.5
Version: 5.5.41-0+wheezy1
Pour l’installer :
marty@vm-compilation-eni:~$ sudo apt-get install mysql-server-5.5
Lors de l’installation, il vous sera demandé de définir le mot de passe de l’utilisateur root de MySQL.
Pour valider l’installation :
marty@vm-compilation-eni:~$ mysql -V
mysql Ver 14.14 Distrib 5.5.41, for debian-linux-gnu (x86_64)
using readline 6.2
marty@vm-compilation-eni:~$ mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.41-0+wheezy1 (Debian)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current
input statement.
...