Mise en cache · 6 min read · Dec 28, 2025
Mise en cache avec mod_cache d'Apache sur Debian Lenny
Mise en cache avec mod_cache d’Apache sur Debian Lenny
Version 1.0
Auteur : Falko Timme
Suivez-moi sur Twitter
Cet article explique comment vous pouvez mettre en cache le contenu de votre site web avec mod_cache d’Apache sur Debian Lenny. Si vous avez un site web dynamique à fort trafic qui génère de nombreuses requêtes de base de données à chaque demande, vous pouvez réduire considérablement la charge du serveur en mettant en cache votre contenu pendant quelques minutes ou plus (cela dépend de la fréquence à laquelle vous mettez à jour votre contenu).
Je ne donne aucune garantie que cela fonctionnera pour vous !
1 Remarque préliminaire
Je suppose que vous avez une configuration Apache2 fonctionnelle (Apache 2.2.x - avant cette version, mod_cache est considéré comme expérimental) des dépôts Debian - la version d’Apache dans les dépôts Debian Lenny est 2.2.9 donc vous devriez être prêt à partir.
J’utilise le répertoire racine /var/www ici pour mon vhost de test - vous devez l’ajuster si votre répertoire racine diffère.
2 Activation de mod_cache
mod_cache a deux sous-modules qui gèrent le stockage du cache, mod_disk_cache (pour stocker le contenu sur le disque dur) et mod_mem_cache (pour stocker le contenu en mémoire, ce qui est plus rapide que le cache sur disque). Décidez lequel vous souhaitez utiliser et continuez soit avec le chapitre 2.1 (mod_disk_cache) soit 2.2 (mod_mem_cache).
2.1 mod_disk_cache
La configuration de mod_disk_cache est stockée dans /etc/apache2/mods-available/disk_cache.conf, alors éditons celui-ci :
vi /etc/apache2/mods-available/disk_cache.confAssurez-vous de décommenter la ligne CacheEnable disk /, de sorte que la configuration minimale ressemble à ceci :
| |
Vous pouvez trouver des explications pour ces options de configuration et d’autres options de configuration sur http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.
Maintenant, nous pouvons activer mod_cache et mod_disk_cache :
a2enmod cache
a2enmod disk_cache
/etc/init.d/apache2 restart Pour s’assurer que notre répertoire de cache /var/cache/apache2/mod_disk_cache ne se remplisse pas avec le temps, nous devons le nettoyer avec la commande htcacheclean. Cette commande fait partie du paquet apache2-utils que nous installons comme suit :
aptitude install apache2-utils Ensuite, nous pouvons démarrer htcacheclean en tant que démon comme ceci :
htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -iCela nettoiera notre répertoire de cache toutes les 30 minutes et s’assurera qu’il ne dépasse pas 100 Mo. Pour en savoir plus sur htcacheclean, jetez un œil à
man htcachecleanBien sûr, vous ne voulez pas démarrer htcacheclean manuellement chaque fois que vous redémarrez le serveur - c’est pourquoi nous éditons /etc/rc.local…
vi /etc/rc.local… et ajoutons la ligne suivante juste avant la ligne exit 0 :
| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |
Cela démarrera htcacheclean automatiquement chaque fois que vous démarrez le serveur.
2.2 mod_mem_cache
La configuration de mod_mem_cache se trouve dans /etc/apache2/mods-available/mem_cache.conf :
vi /etc/apache2/mods-available/mem_cache.conf | |
Ceci est la configuration par défaut - si vous le souhaitez, vous pouvez la modifier. Une liste des directives de configuration pour mod_mem_cache est disponible ici : http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
Maintenant, activons mod_cache et mod_mem_cache comme suit :
a2enmod cache
a2enmod mem_cache
/etc/init.d/apache2 restartC’est déjà tout ! Avec mod_mem_cache, vous n’avez pas besoin de nettoyer les répertoires de cache.
3 Test
Malheureusement, mod_cache ne fournit aucune fonctionnalité de journalisation, ce qui est mauvais si vous voulez savoir si la journalisation fonctionne. C’est pourquoi je crée un petit fichier de test PHP, /var/www/cachetest.php, qui envoie des en-têtes HTTP qui disent à mod_cache qu’il doit mettre en cache le fichier pendant 300 secondes, et qui imprime simplement l’horodatage :
vi /var/www/cachetest.php| "; ?> |
Maintenant, appelez ce fichier dans un navigateur - il devrait afficher l’horodatage actuel. Ensuite, cliquez dans la barre d’adresse du navigateur et appuyez sur ENTRÉE pour que la page se charge à nouveau (ne pas appuyer sur F5 ou le bouton de rechargement - cela récupérera toujours une copie fraîche du serveur au lieu du cache !) - si tout se passe bien, vous devriez toujours voir l’ancien horodatage mis en cache. Si vous attendez 300 secondes, vous devriez obtenir une copie fraîche du serveur au lieu du cache.
4 En-têtes HTTP
La mise en cache ne fonctionne pas par défaut - vous devez modifier votre application web afin que la mise en cache puisse fonctionner (il est possible que votre application web prenne déjà en charge la mise en cache - veuillez consulter la documentation de votre application pour le découvrir). mod_cache mettra en cache les pages web uniquement si les en-têtes HTTP envoyés par votre application web lui disent de le faire.
Voici quelques exemples d’en-têtes qui disent à mod_cache de ne pas mettre en cache :
- En-têtes Expires avec une date dans le passé : “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
- Certains en-têtes Cache-Control : “Cache-Control: no-store, no-cache, must-revalidate” ou “Cache-Control: must-revalidate, max-age=0”
- En-têtes Set-Cookie : une page ne sera pas mise en cache si un cookie est défini.
Donc, si vous voulez que mod_cache mette en cache vos pages, modifiez votre application pour ne pas envoyer de tels en-têtes.
Si vous voulez que mod_cache mette en cache vos pages, vous pouvez définir un en-tête Expires avec une date dans le futur, mais la méthode recommandée est d’utiliser max-age :
"Cache-Control: must-revalidate, max-age=300"Cela dit à mod_cache de mettre en cache la page pendant 300 secondes (max-age) - malheureusement, mod_cache ne connaît pas l’option s-maxage (voir http://www.mnot.net/cache_docs/#CACHE-CONTROL), c’est pourquoi nous devons utiliser l’option max-age (qui dit également à votre navigateur de mettre en cache - veuillez garder cela à l’esprit si vous obtenez des résultats inattendus !). Si mod_cache connaissait l’option s-maxage, nous pourrions utiliser “Cache-Control: must-revalidate, max-age=0, s-maxage=300” qui dirait à mod_cache, mais pas au navigateur, de mettre en cache la page.
Bien sûr, cet en-tête est inutile si vous envoyez l’un des en-têtes non-caching (Expires dans le passé, Set-Cookie, etc.) ci-dessus en même temps !
Un autre en-tête très important pour la mise en cache est celui-ci :
"Vary: Accept-Encoding"Cela fait que mod_cache garde deux copies de chaque page mise en cache, une compressée (gzip) et une non compressée afin qu’il puisse livrer la bonne version en fonction des capacités de l’agent utilisateur/navigateur. Certains agents utilisateurs ne comprennent pas la compression gzip, donc ils devraient obtenir la version non compressée.
Voici donc le résumé : utilisez les deux en-têtes suivants si vous voulez que mod_cache mette en cache :
“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”
et assurez-vous qu’aucun Expires avec une date dans le passé, cookies, etc. ne sont envoyés.
Si votre application est écrite en PHP, vous pouvez utiliser la fonction header() de PHP pour envoyer des en-têtes HTTP, par exemple comme ceci :
header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);
Cette page est un must si vous voulez en savoir plus sur les en-têtes HTTP et la mise en cache : http://www.mnot.net/cache_docs/
5 Liens
- Apache : http://httpd.apache.org/
- mod_cache : http://httpd.apache.org/docs/2.2/mod/mod_cache.html
- mod_disk_cache : http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
- mod_mem_cache : http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
- Guide de mise en cache d’Apache : http://httpd.apache.org/docs/2.2/caching.html
- Tutoriel sur la mise en cache : http://www.mnot.net/cache_docs/
- Debian : http://www.debian.org/
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.