De Création site Internet Le Mans Sarthe (agence Nozicaa).
Sommaire |
Cache Web
La mise en cache de document Web (ex : page HTML, images) est utilisé afin de réduire la consommation de bande passante, la charge serveur ou améliorer la rapidité de consultation.
Un cache Web conserve des copies de documents transitant par son biais. Le cache peut, dans certaines conditions, répondre aux requêtes ultérieures à partir de ses copies, sans recourir au serveur Web. Une prise en compte adaptée des caches Web dès sa création permet d’améliorer la qualité d’accès à votre site.
Deux types de cache Web peuvent être distingués :
- côté client, ou cache intégré dans votre navigateur Web (Apple Safari, Mozilla Firefox, …),
- intermédiaire, ou cache localisé sur la liaison (réseau, connexion) entre votre navigateur et le serveur Web.
Selon les situations, différents caches Web, éventuellement de différents type, peuvent se “combiner”.
Protocole
Lorsqu’un document Web est accédé par un visiteur, la demande envoyée par ce dernier au serveur peut, outre la référence au document, contenir des métadonnées (entêtes HTTP) spécifiant la manière dont la demande doit être traitée.
Réciproquement, lorsque le serveur retourne une réponse à un visiteur des métadonnées accompagnent le document retourné.
Dans le cadre de la mise en cache Web, certaines métadonnées ou entêtes HTTP sont particulièrement importantes.
Au niveau des demandes (requêtes) envoyées par le visiteur, les entêtes à prendre en compte sont :
- Cache-Control
- Indique les conditions de validité du document demandé (ex : age maximal, ignorer une copie locale pour obtenir un nouveau document “frais”)[1].
- If-Modified-Since
- Indique la date minimale de “fraicheur” du document demandé[2].
- If-None-Match
- Version ou variante requise pour le document demandé[3].
- Age
- Durée pendant laquelle le document a été conservé dans le cache côté client[4].
Au niveau des réponses retournées par le serveur, les entêtes importantes sont :
- Cache-Control
- Indique les conditions de validité du document, “spatialement” (ex : à ne pas conserver sur les caches intermédiaires) ou temporellement (ex : age maximal, revalidation immédiate).
- ETag
- Entity Tag identifie de manière unique une version ou variante d’un document, permettant de distinguer un document A d’un document B mais également différentes version d’un même document (ex : version 1.0 et version 1.1 et/ou variantes personnalisées pour les visiteurs A et B)[5] ; Homologue à l’entête If-None-Match envoyée par le client.
- Last-Modified
- Date de modification du document[6] ; Homologue à l’entête If-Modified-Since envoyée par le client.
Exemples d'utilisation
Les situations suivantes illustrent la problématique de la mise en cache Web, lors de l’accès par navigateur Web à une page HTML située sur un serveur Web (ex : vous visitez la page HTML à l’adresse http://www.nozicaa.com, située sur notre serveur et depuis le navigateur Web installé sur votre ordinateur).
Situation 1
- 1 cache côté client : 1 client Web (navigateur Web)
- 1 serveur Web (ex : Apache HTTP Server)
- pas de cache intermédiaire
Cas A
Requête dite inconditionnelle : le document Web n’a jamais été accédé au travers du navigateur, ou le navigateur demande une copie “fraiche” (envoi des entêtes « Cache-Control: no-cache, max-age=0... » ; ex : <shift> + « Actualiser » dans les navigateurs Web modernes).
- Préparation de la requête par le client : Il n’existe pas de copie valide du document dans le cache côté client, le navigateur ne renseigne pas les entêtes If-Modified-Since, If-None-Match.
- Traitement de la requête par le serveur : Pas de vérification de version ou date de modification (entêtes correspondantes non fournies par le client).
- Traitement de la réponse : Une copie “fraiche” du document est renvoyé, accompagnée des entêtes Last-Modified, ETag, et durée de conservation maximale (age maximal, « Cache-Control: max-age=x »).
Cas B
Requête dite conditionnelle : le visiteur a précédemment récupéré le document demandé.
- Préparation de la requête par le client : Une copie du document existe dans le cache côté client. Le navigateur accompagne sa demande des entêtes « If-Modified-Since: s », avec s étant la date de modification de la copie dans le cache côté client, « If-None-Match: t », avec t correspondant à l’entête ETag retournée lors de la précédente visite, et « Age: a », avec a étant le temps passé par la copie du document dans le cache côté client.
- Traitement de la requête par le serveur :
- Si s est différent de la date de modification sur le serveur, et t est différent du ETag du document sur le serveur, alors la réponse est la même que dans le cas A.
- Si s correspond à la date de modification sur le serveur et t correspond au ETag coté serveur,
- soit a est supérieur à l’age maximal (pour une copie dans un cache client) et alors le traitement de la réponse est le même que dans le cas A,
- soit a est inférieur à l’age maximal et le serveur ne renvoie pas de nouvelle copie du document (statut non modifié : 304 Not Modified[7]) — moins de charge pour le serveur, moins de données à faire transiter.
Bilan
Dans les deux cas (A et B), le navigateur Web envoie toujours une requête (conditionnelle ou non) au serveur. Si la date de modification (Last-Modified) et/ou le ETag sont “plus récent” sur le serveur, le client obtient une nouvelle copie du fichier.
Situation 2
- 1 cache côté client : 1 client Web (navigateur Web)
- 1 serveur Web
- 1 cache intermédiaire entre le client et le serveur (proxy Web, Squid, Varnish …)
Cas C
Requête inconditionnelle : le document Web n’a jamais été accédé au travers du navigateur, ou le navigateur demande une copie “fraiche”.
- Préparation de la requête par le client : Il n’existe pas de copie valide du document dans le cache côté client, le navigateur ne renseigne pas les entêtes If-Modified-Since, If-None-Match.
- Traitement de la requête sur le cache intermédiaire : Pas de vérification de l’existence d’une précédente copie, et transmission de la requête au serveur.
- Traitement de la requête par le serveur : Une copie “fraiche” du document est renvoyé, accompagnée des entêtes Last-Modified, ETag, et durée de conservation maximale (age maximal, « Cache-Control: max-age=x »).
- Traitement de la réponse sur le cache intermédiaire : La copie du document (ainsi que ses entêtes) est enregistrée sur le cache intermédiaire, puis finalement renvoyée au client.
Cas D
Requête dite conditionnelle : le visiteur a précédemment récupéré le document demandé, par biais du cache intermédiaire (une copie du document est donc présente sur le cache intermédiaire).
- Préparation de la requête par le client : Une copie du document existe dans le cache côté client. Le navigateur accompagne sa demande des entêtes « If-Modified-Since: s », avec s étant la date de modification de la copie dans le cache côté client, « If-None-Match: t », avec t correspondant à l’entête ETag retournée lors de la précédente visite, et « Age: a », avec a étant le temps passé par la copie du document dans le cache côté client.
- Traitement de la requête sur le cache intermédiaire :
- Si s correspond à la date de modification dans le cache intermédiaire et t correspond au ETag dans ce même cache,
- soit a est supérieur à l’age maximal (pour une copie dans un cache intermédiaire) et alors le traitement de la requête est le même que dans le cas C,
- soit a est inférieur à l’age maximal et le cache renvoie sa copie du document, sans transmettre la requête au serveur.
- Si s correspond à la date de modification dans le cache intermédiaire et t correspond au ETag dans ce même cache,
Bilan
Au contraire du cache côté client, le cache intermédiaire vérifie en premier lieu ses propres informations. À la réception d’une requête si le cache possède déjà une copie non-expirée (age inférieur à l’age maximal) et correspondante (ETag égal à If-None-Match, et Last-Modified inférieur ou égal à If-Modified-Since), il ne transmet pas la demande au serveur : le serveur n’a pas l’occasion de vérifier s’il possède une copie plus récente.
Pour un visiteur ayant déjà accédé il y a 2 jours à un document, sachant que l’age maximal indiqué pour ce document est d’une semaine (« Cache-Control: max-age=1 semaine » renvoyé avec la précédente copie), le visiteur devra attendre 5 jours avant que le cache intermédiaire cesse de ne consulter que ses propres informations, et consulte à nouveau le serveur.
Attention : Pour des raisons de performances, d’efficacité (ou de non respect des standards), certains caches intermédiaires ignorent le age maximal qui leur ait spécifié, ou utilisent à un age maximal de leur propre choix. Dans ce cas-ci il n’existe aucun moyen pour le client et/ou le serveur de forcer l’échange d’une nouvelle copie du document.
Voir également
Notes
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : Cache-Control. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : If-Modified-Since. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : If-Modified-Since. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : Age. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : ETag. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Header Field Definitions : Last-Modified. juin 1999.
- ↑ Fielding, et al. HTTP/1.1: Status Code Definitions : 304 Not Modified. juin 1999.