fbpx

Mieux comprendre le cache www

cache-proxyLe cache web est un serveur HTTP qui prend place entre un ou plusieurs serveurs web et un ou plusieurs clients. Il prend les requêtes du client (navigateur ou autre) et sauvegarde des copies des réponses du serveur comme les pages HTML, les images ou les fichiers CSS, JavaScript etc.  Si une autre requête à la même ressource (page) se présente, il utilisera alors la réponse qu’il à sauvegardé au lieu de redemander au serveur d’origine.

Dans cet article je vais faire une petite explication sur la notion de Cache Web,  je vais essayer de couvrir plusieurs concepts allant de l’architecture à l’installation et l’utilisation.

Le cache permet de réduire la latence

La requête est retournée depuis le cache -qui est plus proche du client- au lieu d’être retournée du serveur. Cela va prendre moins temps pour afficher le résultat. C’est ce qui rend le web plus “efficace”.

Le cache permet de réduire le trafic réseau

Les résultats sauvegardes dans le cache sont réutilisées ce qui fait réduire la bande passante utilisée par le client. Ce qui permet de coûter moins si le client paye pour le service, diminue les requis en bande passante et la rend plus gérable.

Les types de Caches web

Les caches des navigateurs

La majorité des navigateurs possèdent une gestion de cache. Dans les préférences, vous pourrez spécifier l’espace disque alloue au cache sur votre machine.

cache-config-firefox
Le cache navigateur utilise des règles simples, il va vérifier que les résultas qu’il à sur le disques sont “fraîches”. Il le fait normalement par session.
L’exemple classique est quand un utilisateur utilise le bouton précèdent du navigateur (ou que vous utilisez dans votre code Javascript : window.history.back()); ou quand le site sur lequel vous naviguez utilise les mêmes images dans plusieurs pages, les images vont être servis directement depuis le cache.

Les caches Proxy

les caches Proxy utilisent le même principe mais à une échelle plus grande. Les Proxy servent des centaines voire des milliers de clients. Les fournisseurs de services Internet les installent souvent sur leurs firewalls ou comme dispositifs indépendants.
Le fait que les caches Proxy prennent place sur le réseau, ils pourront certainement intercepter les requêtes passant entre les clients et les serveurs.
En effet, il y à deux méthodes pour utiliser un cache Proxy, vous pouvez indiquer à votre navigateur manuellement.

cache-config-firefox-proxy

Ou bien via “Interception”, ce qui automatiquement fait par le réseau lui même, de telle manière que les clients n’ont pas à être configures pour les utiliser ou même d’en être conscient.

Les caches passerelle

Les caches passerelle ou “reverse Proxy caches” sont aussi des intermédiaires entre les clients et les serveurs. La différence est que ces derniers sont déployés par les administrateurs du site et non par les administrateurs réseaux. Ils permettent de rendre les sites web plus performants et plus évolutifs.
Les requêtes sont routées au cache passerelle via plusieurs méthodes, typiquement on utilise les “équilibreurs de charge” (load balancers) pour faire de sorte qu’une ou plusieurs d’entre eux ressemblent au serveur d’origine pour le client.

Installation d’un cache sur votre serveur

Le cache web est une parmi les notions du web qui ne sont pas bien comprises ou assimilées. En général, les administrateurs des sites web n’en veulent pas parce qu’ils ne veulent pas perdre le contrôle sur leur site; ceci vient du fait que le serveur de cache va cacher les utilisateurs du site, ce qui rend plus difficile d’avoir des informations fraîches concernant les utilisateurs. L’autre problème qui se pose concerne la validité des données caches.
Heureusement, il y a plusieurs moyens pour avoir des statistiques précises sur les utilisateurs de votre site. Aussi, la différence entre un serveur qui utilise du cache et un autre qui en est dépourvu est énorme. Sur un serveur sans cache, le résultat peut prendre plusieurs secondes, sur un serveur utilisant du cache, le résultat peut être instantané.
Les grandes compagnies déboursent des millions de dollars pour avoir des serveurs partout sur la planète afin que leur contenu soit accessible le plus rapidement possible, ils sont plus proches de l’utilisateur final.

Il faut toujours savoir que les caches Proxy et les caches navigateurs vont être toujours utilises. Aussi, si vous ne configurez pas bien votre site correctement, les pages seront cachées selon paramètres par défaut décide par l’administrateur du site.

Comment marche le cache?

Tous les serveurs de cache ont des règles pour déterminer s’ils doivent servir les résultats via le cache si cela existe. Une partie de ces règles est contenue dans le protocole HTTP, et une autre partie est configurée par l’administrateur du cache (l’utilisateur pour le cache navigateur, l’administrateur pour le cache Proxy ou passerelle).

Généralement, les règles utilisées sont :
1. Si les entêtes HTTP de la réponse serveur ne demandent pas de cacher les résultats, le cache ne le fera pas.
2. Si la requête est sécurisée (HTTPS), la réponse ne sera pas cachée.
3. Une réponse cachée est considérée fraîche -et peux donc envoyée vers le client
– Si elle à une date d’expiration ou une autre entête de contrôle d’age qui n’est toujours pas expirée.
– Si le résultat a été récemment découvert par le cache et que ce résultat à une date de modification considérablement vieille

4. Si un résultat est vicieux, le serveur d’origine sera demande de le re-valider et indiquer au cache si ce dernier est encore valide.
5. Dans certaines conditions, lorsqu’il est deconnecte du réseau, le cache peut servir des données vicieuses sans demander la validation du serveur d’origine.

Ensemble, les paramètres validation et fraîcheur sont les moyens les plus importants pour le travail du cache. Un résultat frais est disponible instantanément à partir du cache. Un résultat valide va éviter l’envoi du résultat entier une autre fois si rien n’a été change.

Comment peut on contrôler le cache

Plusieurs outils permettent aux développeurs et administrateurs de contrôler la manière dont les caches vont traiter leurs données. Cela demande un peu de bidouillage de configuration sur vos serveurs, mais les résultats valent vraiment le coup.

Les balises HTML et les entêtes HTTP

La partie de votre page html contient des balises meta qui vont décrire le document. Ces balises sont généralement utilisées pour marquer que ce document n’est plus valide ou qu’il ne sera plus accessible à partir d’un certain temps.

Ces balises ne sont pas très effectifs du fait qu’elles sont honores par par peu de caches navigateurs et pas par les caches proxys puisque ces derniers ne lisent pas le contenu HTML du document.

Par contre, les entêtes HTTP vous donnent un contrôle effectif sur la manière avec laquelle le navigateur et les caches Proxy vont traiter vos réponses. Bien que non visibles dans le document HTML, ils sont automatiquement générés par votre serveur web. Vous pouvez par contre les contrôler à un certain degré, dépendamment du serveur que vous utilisez.
Les entêtes HTTP sont envoyés par le serveur avant le document HTML, ils ne sont visibles que par les navigateurs et les caches intermédiaires.

Voici une entête HTTP 1.1 typique :

HTTP/1.1 200 OK
Date: Sat, 20 Jun 2009 10:10:01 GMT
Server: Apache/2.2.10 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Sun, 21 Jun 2009 14:30:21 GMT
Last-Modified: Mon, 15 Jun 2009 07:50:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html

Pour savoir comment Installer et activer le cache sur votre serveur (link to Apache)

Contrôler la validité avec l’entête Expires:

L’entête HTTP Expires est un moyen basique pour contrôler le cache. Il indique au cache combien de temps la réponse associée sera valide. Une fois ce temps dépasse, les serveurs de cache vont demander la validation du serveur pour savoir si le document est change.
La majorité des serveurs web permettent d’indiquer l’entête Expires avec plusieurs moyens. Généralement, ils permettent d’indiquer un temps d’expiration absolu, un temps base sur le dernier temps d’accès au document, ou encore un temps base sur le dernier temps de modification du document sur le serveur.

L’entête Expires sert à rendre des contenus statiques comme les images et les fichiers CSS et Javascript par exemple. Ces derniers changent très peu, vous pouvez donc indiquer un temps d’expiration très long pour eux. Expires sert aussi pour contrôler le cache d’une page qui est régulièrement changée. Par exemple, si vous mettez à jour votre page d’accueil chaque jour à 5h du matin, vous pouvez spécifier l’expiration de la réponse à ce temps, de telle sorte que les caches vont avoir à prendre une nouvelle copie sans que les utilisateurs aient à rafraîchir.
La valeur de l’entête Expires est une date HTTP. Tout le reste sera interprète comme une date dans le passe, ce qui rend le contenu non caché. La date est toujours indiquée dans le format GMT.
Exemple

Expires: Sat, 20 Jun 2009 18:04:50 GMT

L’entête Expires à quelques limitations venant du fait que le paramètre indique est une date et que les horloges sur le serveur et les serveurs de cache ne sont pas forcément synchronisées.
Un autre problème est que c’est facile d’oublier que vous aviez défini un certain contenu à expirer à un certain temps. Si vous ne mettez pas à jour à temps le paramètre Expires, chaque requête sera acheminée sur votre serveur ce qui va augmenter la charge et la latence.

L’entête Cache-Control

L’entête Cache-Control inclut plusieurs configurations:
– max-age= : spécifie le temps maximum durant lequel la réponse est considérée comme valide. Vous pouvez spécifier le nombre de secondes dans lesquelles votre réponse est valide, à partir du temps de votre requête.
– s-max-age= : même chose que max-age sauf que ce paramètre est destine aux caches proxy (shared)
– public : normalement, si une authentification HTTP est requise, les données ne seront pas cachées. Avec ce paramètre, vous pouvez spécifier que les données seront cachées dans ce cas.

– no-cache: force le cache à soumettre une requête au serveur pour validation avant de renvoyer la copie cachée, et ceci à chaque requête. Ceci permet d’avoir un document toujours frais sans toutefois sacrifier les avantages du cache.

– no-store: indique au cache de ne pas laisser une copie de la réponse.
– must-revalidate: indique au cache d’obéir aux informations indiquées par rapport à la réponse. Puisque HTTP permet au serveurs de cache de servir un contenu vicieux dans certaines conditions, avec cette entête, vous obligez le cache à suivre vos règles.

– proxy-revalidate: même chose que must-revalidate sauf qu’il s’adresse au cache proxy.
Exemple :

Cache-Control: max-age=3600, must-revalidate

Les validateurs

Les validateurs sont importants. Si l’un d’eux n’est pas présent et qu’il n’y à pas d’information concernant l’expiration ou le contrôle de cache, les serveurs de cache ne vont pas sauvegarder les réponses.

Le validateur le plus commun représente auquel le document à été modifie la dernière fois, comme indiquée par l’entête Last-Modified. Quand le cache possède une réponse sauvegardée et qui inclut une entête  Last-Modified, il pourra l’utiliser pour demander au serveur si le document à été change depuis la dernière fois qu’il l’a consultée. Ceci est fait via une requête If-Modified-Since.

D’autre part, le validateur ETag est des identificateurs uniques générés  par le serveur et changés chaque fois que le document relatif change. Parce que le serveur contrôle comment ETag est généré, les caches peuvent être surs que si le ETag coïncide avec la réponse de leur requête If-None-Match, le document est toujours la même.

La plupart des navigateurs génèrent les entêtes Etag et Last-Modified pour les utiliser comme validateurs pour du contenu statique (images, fichiers CSS etc.)

Astuces pour que votre site soit « Conscient » du cache

Vous pouvez  améliorer la capacité de votre site à bénéficier du cache avec :

–         Une utilisation consistante de vos URLs : C’est plutôt la règle d’Or du cache. Si vous servez le même contenu dans plusieurs pages à différents utilisateurs, ou depuis plusieurs sites ; il devrait toujours avoir la même URL. C’est le moyen le plus simple et le plus efficace pour bénéficier du cache. Par exemple, si vous utilisez « /index.html » dans votre HTML comme référence, utilisez le toujours de cette manière.

–         Une utilisation d’une librairie commune d’images et d’autres éléments pour en référer de plusieurs places différents.

–         Une indication aux serveurs de cache de sauvegarder les images et les pages qui ne changent pas toujours : en spécifiant Cache-Control : max-age avec une grande valeur.

–         Une indication aux serveurs de cache pour reconnaître les pages mises à jour régulièrement : en spécifiant une entête max-age adéquate.

–         Si une ressource (un fichier à télécharger) change, changez son nom : de cette manière, vous allez forcer son expiration dans le futur, et vous garantissez que la bonne version est servie.

–         Ne changez pas les fichiers sans raison : si vous faites ceci, les entêtes Last-Modified vont être modifiées. Par exemple, quand vous mettez votre site à jour, ne copiez pas tout le site, copiez juste les fichiers qui ont change.

–         Utilisez les cookies seulement quand c’est nécessaire : les cookies sont difficiles à cacher et ne sont pas nécessaires dans la plupart des situations. Si vous devez utiliser un cookie, limitez son utilisation dans les pages dynamiques.

–         Minimisez l’utilisation de SSL : les pages encryptées ne sont pas stockées par les caches proxy. Utilisez les seulement quand vous en avez besoin.

Implémentation

Utilisation dans PHP

Par défaut, les réponses manipulées par PHP ne sont pas cachées. Par contre, les développeurs peuvent préciser les entêtes HTTP en utilisant la fonction header().

A titre d’exemple, ce script crée une entête Cache-Control et spécifie l’entête Expires dans deux jours :

header("Cache-Control: must-revalidate");

 $in = 60 * 60 * 24 * 2;
 $expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $in) . " GMT";
 Header($expire);

N’oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.

Plus d’information sur la manipulation des entêtes avec PHP

Installation et configuration sur Apache

Apache utilise des modules optionnels pour inclure les entêtes incluant les paramètres Expires et Cache-Control. Vous pouvez activez ces deux modules en tapant dans un Shell
> a2enmod headers
> a2enmod expires

Le module expires peut être utilise pour déterminer quand est ce que les données expirent, ceci peut être configure dans les fichiers .htaccess ou globalement dans votre access.conf. Vous pouvez spécifier
l’expiration par rapport à l’accès ou par rapport à la modification.
Voici un exemple de configuration :

ExpiresActive On
# les données expirent après 6 heures du dernier accès
ExpiresDefault A21600
# les images expirent après 30 jours
ExpiresByType image/gif A2592000
ExpiresByType image/jpg "access plus 30 days"
# Les pages d'erreur n'expirent jamais : expiration à zéro
ExpiresDefault A0
# Appliquer un Cache-Control pour index.html
Header append Cache-Control "public, must-revalidate"

Plus d’information sur mod_expires

Plus de détails sur mod_headers

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...