Mise en cache · 3 min read · Jan 01, 2026

Mise en cache avec mod_cache d'Apache sur Debian Etch - Page 2

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   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

C’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 force-reload

C’est déjà fait ! Avec mod_mem_cache, vous n’avez pas besoin de nettoyer les répertoires de cache.

3 Test

Malheureusement, mod_cache ne fournit pas de fonctionnalités de journalisation, ce qui est mauvais si vous voulez savoir si la journalisation fonctionne. Par conséquent, je crée un petit fichier de test PHP, /var/www/cachetest.php, qui envoie des en-têtes HTTP indiquant à mod_cache qu’il doit mettre en cache le fichier pendant 300 secondes, et qui affiche 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 ENTRER pour que la page se recharge (ne pas appuyer sur F5 ou sur 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 indique à 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 indique é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 en même temps l’un des en-têtes non-cache (Expires dans le passé, Set-Cookie, etc.) ci-dessus !

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 incontournable 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

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.