Chapitre 312 minIntermédiaire
Apache 2.4 : VirtualHost, modules et différences avec Nginx
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- créer et activer un VirtualHost Apache ;
- activer les modules utiles et choisir le bon MPM ;
- expliquer pourquoi un fichier .htaccess est ignoré ;
- traduire une configuration Apache en configuration Nginx ;
- justifier le choix entre Apache et Nginx.
3 exercices corrigés
Apache HTTP Server, ou simplement Apache, est le serveur web libre le plus ancien encore très utilisé : beaucoup d'applications (GLPI, WordPress, Nextcloud, phpMyAdmin) donnent d'abord leur configuration pour lui. Ce chapitre montre comment il est organisé sous Debian, crée un VirtualHost, explique les modules, les MPM et les fichiers .htaccess, puis compare Apache et Nginx pour t'aider à choisir et à justifier ton choix.
Installer Apache et lire son arborescence
Apache et Nginx ne peuvent pas écouter tous les deux sur le port 80 de la même machine. Pour suivre ce chapitre, utilise une VM de test, par exemple un clone de srv-web dans ton laboratoire.
sudo apt install apache2
systemctl status apache2 --no-pager
apache2 -v
# Server version: Apache/2.4.69 (Debian)
Le numéro exact dépend des mises à jour reçues : Debian 13 fournit la branche 2.4, qui reçoit ses correctifs sans changement de comportement.
| Chemin | Rôle |
|---|---|
/etc/apache2/apache2.conf | Configuration principale |
/etc/apache2/ports.conf | Les ports d'écoute (Listen 80, et Listen 443 si le module ssl est actif) |
/etc/apache2/sites-available/ et sites-enabled/ | Les VirtualHosts, comme pour Nginx sous Debian |
/etc/apache2/mods-available/ et mods-enabled/ | Les modules disponibles et actifs |
/etc/apache2/conf-available/ et conf-enabled/ | Les fragments de configuration communs (security.conf, php8.4-fpm.conf) |
/var/log/apache2/ | access.log, error.log et other_vhosts_access.log |
Debian fournit quatre commandes pour activer et désactiver ces éléments sans manipuler les liens à la main : a2ensite / a2dissite pour les sites, a2enmod / a2dismod pour les modules, a2enconf / a2disconf pour les fragments. Après chacune, Apache doit relire sa configuration.
sudo apachectl configtest # Syntax OK
sudo systemctl reload apache2
Créer un VirtualHost
Un VirtualHost est l'équivalent Apache d'un server block de Nginx : un site, identifié par son nom et son port. Le même site de recette qu'au chapitre précédent, dans /etc/apache2/sites-available/recette.conf :
<VirtualHost *:80>
ServerName recette.sorbier-logistique.fr
DocumentRoot /var/www/recette/public
<Directory /var/www/recette/public>
Options -Indexes +FollowSymLinks
AllowOverride None
Require ip 192.168.10.208/28 192.168.10.64/26
</Directory>
ErrorLog ${APACHE_LOG_DIR}/recette-error.log
CustomLog ${APACHE_LOG_DIR}/recette-access.log combined
</VirtualHost>
| Directive | Rôle |
|---|---|
<VirtualHost *:80> | Le site écoute sur toutes les adresses, port 80 |
ServerName | Le nom comparé à l'en-tête Host (ajoute ServerAlias pour d'autres noms) |
DocumentRoot | La racine du site |
<Directory> | Les règles qui s'appliquent à un dossier et à ses sous-dossiers |
Options -Indexes | Interdit la liste automatique des fichiers d'un dossier sans page d'index |
AllowOverride None | Ignore les fichiers .htaccess du dossier |
Require ip … | Autorise seulement ces réseaux (Require all granted pour tout le monde) |
${APACHE_LOG_DIR} | Variable définie dans /etc/apache2/envvars : /var/log/apache2 |
sudo mkdir -p /var/www/recette/public
sudo a2ensite recette
sudo a2dissite 000-default
sudo apachectl configtest && sudo systemctl reload apache2
Comme Nginx, Apache envoie une requête dont le nom ne correspond à aucun ServerName au premier VirtualHost du port, dans l'ordre alphabétique des fichiers de sites-enabled : c'est pour cela que le site par défaut de Debian s'appelle 000-default.conf.
Masquer la version. Le fragment conf-available/security.conf de Debian contient ServerTokens OS et ServerSignature On : les en-têtes et les pages d'erreur annoncent la version d'Apache et le système. Passe-les à ServerTokens Prod et ServerSignature Off.
Les modules
Apache est modulaire : chaque fonction (réécriture d'adresses, TLS, en-têtes, reverse proxy, PHP) est un module qu'on active seulement si l'on en a besoin. Moins de modules, c'est moins de code exposé.
| Module | Sert à | Activer |
|---|---|---|
rewrite | Réécrire les adresses (routeur d'une application, redirections) | a2enmod rewrite |
ssl | HTTPS | a2enmod ssl |
headers | Ajouter des en-têtes de sécurité (HSTS, X-Content-Type-Options) | a2enmod headers |
proxy, proxy_http | Reverse proxy vers une autre application | a2enmod proxy proxy_http |
proxy_fcgi, setenvif | Transmettre les scripts PHP à PHP-FPM | a2enmod proxy_fcgi setenvif |
status | Page d'état du serveur (à restreindre au réseau d'administration) | actif par défaut |
apache2ctl -M # liste les modules chargés
Les MPM : comment Apache traite les connexions
Le MPM (Multi-Processing Module) décide comment Apache répartit les connexions entre ses processus. Un seul est actif à la fois.
| MPM | Fonctionnement | Usage |
|---|---|---|
prefork | Un processus par connexion, sans fils d'exécution | Obligatoire avec le module libapache2-mod-php, qui n'est pas sûr avec les fils d'exécution ; gourmand en mémoire |
worker | Plusieurs processus, chacun avec plusieurs fils d'exécution | Rarement choisi aujourd'hui |
event | Comme worker, mais un fil dédié gère les connexions inactives (keep-alive) | Celui de Debian par défaut, le plus efficace, à combiner avec PHP-FPM |
apache2ctl -V | grep MPM
# Server MPM: event
L'installation du paquet libapache2-mod-php8.4 fait basculer Apache sur prefork. Pour un serveur qui doit tenir la charge, préfère l'MPM event et PHP-FPM, comme avec Nginx :
sudo apt install php8.4-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.4-fpm
sudo systemctl reload apache2
Le fragment php8.4-fpm.conf envoie tous les fichiers .php au socket de PHP-FPM, /run/php/php8.4-fpm.sock. Le fonctionnement de PHP-FPM est expliqué au chapitre 4.
Les fichiers .htaccess
Un fichier .htaccess placé dans un dossier du site contient des directives Apache qui s'appliquent à ce dossier. Il permet à un développeur de régler des redirections ou une protection sans toucher à la configuration du serveur : c'est le mode de fonctionnement des hébergements mutualisés.
# /var/www/recette/public/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Apache ne lit ces fichiers que si la directive AllowOverride du dossier l'autorise. Sous Debian, apache2.conf règle AllowOverride None pour /var/www/ : un .htaccess est donc ignoré tant que tu n'as pas écrit, dans le VirtualHost, AllowOverride All (tout autoriser) ou une liste précise (AllowOverride FileInfo AuthConfig).
Apache ou Nginx : comment choisir
| Critère | Apache 2.4 | Nginx |
|---|---|---|
| Modèle de traitement | Processus et fils d'exécution (MPM event par défaut sous Debian) | Événementiel : quelques processus de travail, des milliers de connexions chacun |
| Mémoire sous forte charge | Plus élevée, surtout avec prefork | Faible et stable |
| Fichiers statiques | Bon | Très bon |
| PHP | Module intégré (mod_php) ou PHP-FPM | PHP-FPM uniquement |
| Configuration décentralisée | Fichiers .htaccess | Aucune : tout est dans la configuration du serveur |
| Reverse proxy, répartition de charge | Possible (mod_proxy, mod_proxy_balancer) | Point fort historique |
| Documentation des applications | Presque toujours fournie | Souvent fournie, parfois à adapter |
Dans la pratique, les deux conviennent pour un intranet ou une application de gestion. Choisis selon la documentation de l'application, les compétences de l'équipe et le rôle du serveur. Nginx s'impose quand le serveur sert de reverse proxy ou de répartiteur devant d'autres ; Apache reste naturel quand l'application est livrée avec ses .htaccess. Chez Sorbier, l'équipe a choisi Nginx partout, pour n'avoir qu'un serveur web à maîtriser, à durcir et à superviser. À l'oral, c'est ce genre de justification qu'on attend : un critère lié au contexte, pas « Nginx est plus rapide ».
Exercices
Exercice 1 sur 3 Traduire un VirtualHost en server block Réussi À revoir
Traduis ce VirtualHost en server block Nginx équivalent.
<VirtualHost *:80>
ServerName intranet.ad.sorbier.example
ServerAlias intranet
DocumentRoot /var/www/intranet
<Directory /var/www/intranet>
Options -Indexes
Require ip 192.168.10.0/24
</Directory>
ErrorLog ${APACHE_LOG_DIR}/intranet-error.log
CustomLog ${APACHE_LOG_DIR}/intranet-access.log combined
</VirtualHost>
Voir la réponseMasquer la réponse de l'exercice 1
server {
listen 80;
server_name intranet.ad.sorbier.example intranet;
root /var/www/intranet;
index index.html;
allow 192.168.10.0/24;
deny all;
access_log /var/log/nginx/intranet-access.log;
error_log /var/log/nginx/intranet-error.log;
location / {
try_files $uri $uri/ =404;
}
}
ServerAlias devient un second nom dans server_name. Options -Indexes n'a pas besoin d'équivalent : Nginx ne liste jamais le contenu d'un dossier, sauf si l'on écrit autoindex on. Require ip devient le couple allow / deny all. Le format combined est celui par défaut du journal d'accès de Nginx.
Tu avais trouvé ?
Exercice 2 sur 3 Le .htaccess ignoré Réussi À revoir
Un développeur a déposé l'application de recette sur une Debian avec Apache. Seule la page d'accueil fonctionne : /colis/48213 renvoie une erreur 404, alors que son .htaccess contient les règles de réécriture vers index.php. Le module rewrite est actif. Que se passe-t-il, et quelles sont les deux corrections possibles ? Laquelle recommandes-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
Sous Debian, apache2.conf règle AllowOverride None sur /var/www/ : Apache ne lit pas le .htaccess, donc la réécriture n'a jamais lieu et /colis/48213 est cherché comme un fichier, qui n'existe pas.
- Autoriser le fichier :
AllowOverride FileInfo(le groupe de directives qui contient la réécriture) dans le<Directory>du VirtualHost. - Recopier les règles dans le VirtualHost lui-même, dans le bloc
<Directory /var/www/recette/public>, et garderAllowOverride None.
La seconde est préférable sur un serveur administré : la configuration est au même endroit, versionnable, et Apache ne cherche pas de .htaccess dans chaque dossier. Dans les deux cas : apachectl configtest puis systemctl reload apache2.
Tu avais trouvé ?
Exercice 3 sur 3 Justifier un choix Réussi À revoir
Pour ta réalisation d'E6, tu dois héberger GLPI et une page d'accueil de l'intranet sur un même serveur, et la commission te demande pourquoi tu as choisi Nginx plutôt qu'Apache. Rédige une réponse de trois ou quatre phrases.
Voir la réponseMasquer la réponse de l'exercice 3
Une réponse possible : « GLPI fournit une configuration officielle pour Nginx avec PHP-FPM, donc les deux serveurs convenaient. J'ai choisi Nginx parce que l'infrastructure l'utilise déjà comme reverse proxy devant le site public : l'équipe n'a qu'un seul serveur web à connaître, à durcir et à superviser. Son fonctionnement événementiel consomme peu de mémoire sur une petite VM, et PHP-FPM isole chaque application dans son propre pool, avec son propre compte. Je n'avais pas besoin des .htaccess, puisque j'administre le serveur. »
Ce qu'on évite : « Nginx est meilleur » ou « plus rapide » sans contexte. Un bon argument relie le choix à l'existant, à l'équipe ou à une contrainte mesurable.
Tu avais trouvé ?