Principes de base de la mise en cache Web: terminologie, en-têtes HTTP et stratégies de mise en cache

introduction

La mise en cache de contenu intelligent est l’un des moyens les plus efficaces d’améliorer l’expérience des visiteurs de votre site. La mise en cache, ou le stockage temporaire du contenu de demandes précédentes, fait partie de la stratégie de livraison de contenu principale implémentée dans le protocole HTTP. Les composants tout au long du chemin de livraison peuvent mettre en cache tous les éléments pour accélérer les demandes ultérieures, sous réserve des stratégies de mise en cache déclarées pour le contenu.

Dans ce guide, nous aborderons certains des concepts de base de la mise en cache de contenu Web. Cela couvrira principalement la manière de sélectionner les stratégies de mise en cache afin de garantir que les caches sur Internet puissent traiter correctement votre contenu. Nous aborderons les avantages de la mise en cache, les effets secondaires à connaître et les différentes stratégies à utiliser pour obtenir le meilleur mélange de performances et de flexibilité.

Qu'est-ce que la mise en cache?

La mise en cache est le terme utilisé pour stocker les réponses réutilisables afin de faire les demandes suivantes plus rapidement. Il existe de nombreux types de mise en cache disponibles, chacun ayant ses propres caractéristiques. Les caches d'applications et les caches de mémoire sont populaires pour leur capacité à accélérer certaines réponses.

La mise en cache Web, l’objet de ce guide, est un type de cache différent. La mise en cache Web est une caractéristique essentielle du protocole HTTP, conçue pour minimiser le trafic réseau tout en améliorant la réactivité perçue du système dans son ensemble. Les caches se trouvent à chaque niveau du parcours d'un contenu, du serveur d'origine au navigateur.

La mise en cache Web fonctionne en mettant en cache les réponses HTTP pour les demandes selon certaines règles. Les demandes ultérieures de contenu mis en cache peuvent ensuite être satisfaites depuis un cache plus proche de l'utilisateur au lieu de renvoyer la demande jusqu'au serveur Web.

Avantages

La mise en cache efficace aide à la fois les consommateurs de contenu et les fournisseurs de contenu. Parmi les avantages apportés par la mise en cache pour la livraison du contenu, citons:

  • Decreased network costs: le contenu peut être mis en cache à divers points du chemin réseau entre le consommateur de contenu et l'origine du contenu. Lorsque le contenu est mis en cache plus près du consommateur, les demandes n'entraîneront pas beaucoup d'activités réseau supplémentaires au-delà du cache.

  • Improved responsiveness: la mise en cache permet de récupérer plus rapidement le contenu car un aller-retour complet du réseau n'est pas nécessaire. Les caches conservés près de l'utilisateur, comme le cache du navigateur, peuvent rendre cette récupération presque instantanée.

  • Increased performance on the same hardware: pour le serveur d'où provient le contenu, plus de performances peuvent être tirées du même matériel en autorisant une mise en cache agressive. Le propriétaire du contenu peut exploiter les puissants serveurs du chemin de livraison pour supporter le fardeau de certains chargements de contenu.

  • Availability of content during network interruptions: avec certaines stratégies, la mise en cache peut être utilisée pour diffuser du contenu aux utilisateurs finaux même s'il peut être indisponible pendant de courtes périodes à partir des serveurs d'origine.

Terminologie

Lorsque vous traitez avec la mise en cache, il existe quelques termes que vous rencontrerez probablement qui pourraient être inconnus. Certains des plus communs sont ci-dessous:

  • Origin server: le serveur d'origine est l'emplacement d'origine du contenu. Si vous agissez en tant qu'administrateur de serveur Web, il s'agit de la machine que vous contrôlez. Il est responsable de la fourniture de tout contenu qui n'a pas pu être extrait d'un cache le long de la route de demande et de la définition de la stratégie de mise en cache pour tout le contenu.

  • Cache hit ratio: l’efficacité d’un cache est mesurée en termes de taux d’accès au cache ou de taux de réussite. Il s'agit d'un rapport entre les demandes pouvant être extraites d'un cache et le nombre total de demandes. Un taux d'accès au cache élevé signifie qu'un pourcentage élevé du contenu a pu être extrait du cache. C'est généralement le résultat souhaité par la plupart des administrateurs.

  • Freshness: La fraîcheur est un terme utilisé pour décrire si un élément dans un cache est toujours considéré comme un candidat pour servir à un client. Le contenu d'un cache ne sera utilisé pour répondre que s'il se trouve dans le délai d'actualisation spécifié par la stratégie de mise en cache.

  • Stale content: les éléments du cache expirent en fonction des paramètres de fraîcheur du cache dans la stratégie de mise en cache. Le contenu expiré est «périmé». En général, le contenu expiré ne peut pas être utilisé pour répondre aux demandes des clients. Le serveur d'origine doit être recontacté pour récupérer le nouveau contenu ou au moins vérifier que le contenu mis en cache est toujours précis.

  • Validation: les éléments périmés du cache peuvent être validés afin d'actualiser leur heure d'expiration. La validation implique une vérification auprès du serveur d'origine pour voir si le contenu mis en cache représente toujours la version la plus récente de l'élément.

  • Invalidation: l'invalidation est le processus de suppression du contenu du cache avant la date d'expiration spécifiée. Cela est nécessaire si l'élément a été modifié sur le serveur d'origine et qu'un élément obsolète dans le cache entraînerait des problèmes importants pour le client.

Il existe de nombreux autres termes de mise en cache, mais ceux ci-dessus devraient vous aider à démarrer.

Que peut-on mettre en cache?

Certains contenus se prêtent plus facilement à la mise en cache que d'autres. Certains contenus très conviviaux pour la plupart des sites sont:

  • Logos et images de marque

  • Images non rotatives en général (icônes de navigation, par exemple)

  • Feuilles de style

  • Fichiers Javascript généraux

  • Contenu téléchargeable

  • Fichiers Médias

Celles-ci ont tendance à changer rarement, de sorte qu'elles peuvent bénéficier d'une mise en cache plus longue.

Certains éléments que vous devez être prudent dans la mise en cache sont les suivants:

  • Pages HTML

  • Rotation des images

  • Javascript et CSS fréquemment modifiés

  • Contenu demandé avec des cookies d'authentification

Certains éléments qui ne devraient presque jamais être mis en cache sont:

  • Actifs liés à des données sensibles (informations bancaires, etc.)

  • Contenu spécifique à l'utilisateur et fréquemment modifié

Outre les règles générales ci-dessus, il est possible de spécifier des stratégies vous permettant de mettre en cache différents types de contenu de manière appropriée. Par exemple, si les utilisateurs authentifiés voient tous la même vue de votre site, il peut être possible de la mettre en cache n'importe où. Si les utilisateurs authentifiés voient une vue du site sensible à l'utilisateur qui sera valide pendant un certain temps, vous pouvez indiquer au navigateur de l'utilisateur de mettre en cache, mais aux caches intermédiaires de ne pas stocker la vue.

Emplacements où le contenu Web est mis en cache

Le contenu peut être mis en cache à différents moments de la chaîne de diffusion:

  • Browser cache: les navigateurs Web eux-mêmes maintiennent un petit cache. En règle générale, le navigateur définit une stratégie qui dicte les éléments les plus importants à mettre en cache. Il peut s'agir d'un contenu spécifique à l'utilisateur ou d'un contenu jugé coûteux à télécharger et susceptible d'être redemandé.

  • Intermediary caching proxies: tout serveur entre le client et votre infrastructure peut mettre en cache certains contenus comme vous le souhaitez. Ces caches peuvent être gérés par des fournisseurs de services Internet ou d'autres parties indépendantes.

  • Reverse Cache: votre infrastructure de serveur peut implémenter son propre cache pour les services de backend. De cette façon, le contenu peut être servi à partir du point de contact au lieu de toucher les serveurs principaux à chaque demande.

Chacun de ces emplacements peut et doit souvent mettre en cache des éléments en fonction de leurs propres stratégies de cache et des stratégies définies à l'origine du contenu.

Caching Headers

La politique de mise en cache dépend de deux facteurs différents. L'entité de mise en cache elle-même doit décider de mettre en cache ou non le contenu acceptable. Il peut décider de mettre en cache moins qu'il n'est autorisé à mettre en cache, mais jamais plus.

La majorité du comportement de la mise en cache est déterminée par la stratégie de mise en cache, définie par le propriétaire du contenu. Ces stratégies sont principalement articulées via l’utilisation d’en-têtes HTTP spécifiques.

À travers différentes itérations du protocole HTTP, quelques en-têtes centrés sur le cache ont été créés avec différents niveaux de sophistication. Ceux auxquels vous devez probablement encore faire attention sont ci-dessous:

  • Expires: l'en-têteExpires est très simple, bien que de portée assez limitée. Fondamentalement, il définit une date future dans laquelle le contenu expirera. À ce stade, toute demande pour le même contenu devra être renvoyée au serveur d'origine. Cet en-tête est probablement mieux utilisé que comme solution de secours.

  • Cache-Control: il s'agit du remplacement le plus moderne de l'en-têteExpires. Il est bien pris en charge et implémente une conception beaucoup plus flexible. Dans presque tous les cas, c'est préférable àExpires, mais il peut ne pas faire de mal de définir les deux valeurs. Nous discuterons des spécificités des options que vous pouvez définir avecCache-Control un peu plus tard.

  • Etag: l'en-têteEtag est utilisé avec la validation du cache. L'origine peut fournir unEtag unique pour un élément lors de la diffusion initiale du contenu. Lorsqu'un cache a besoin de valider le contenu qu'il a en main à l'expiration, il peut renvoyer lesEtag dont il dispose pour le contenu. L'origine indiquera au cache que le contenu est le même, ou enverra le contenu mis à jour (avec les nouveauxEtag).

  • Last-Modified: cet en-tête spécifie la dernière fois que l'élément a été modifié. Cela peut être utilisé dans le cadre de la stratégie de validation pour garantir un nouveau contenu.

  • Content-Length: bien qu'il ne soit pas spécifiquement impliqué dans la mise en cache, l'en-têteContent-Length est important à définir lors de la définition des stratégies de mise en cache. Certains logiciels refuseront de mettre en cache le contenu s'ils ne connaissent pas à l'avance la taille du contenu pour lequel ils devront réserver de l'espace.

  • Vary: un cache utilise généralement l'hôte demandé et le chemin d'accès à la ressource comme clé avec laquelle stocker l'élément de cache. L'en-têteVary peut être utilisé pour indiquer aux caches de prêter attention à un en-tête supplémentaire pour décider si une demande concerne le même élément. Ceci est le plus couramment utilisé pour indiquer aux caches de saisir également l'en-têteAccept-Encoding, afin que le cache sache qu'il faut faire la différence entre le contenu compressé et non compressé.

Un aparté sur l'en-tête Vary

L'en-têteVary vous offre la possibilité de stocker différentes versions du même contenu au détriment de la dilution des entrées dans le cache.

Dans le cas deAccept-Encoding, la définition de l'en-têteVary permet une distinction critique entre le contenu compressé et non compressé. Cela est nécessaire pour fournir correctement ces éléments aux navigateurs qui ne peuvent pas gérer le contenu compressé et pour fournir une utilisation de base. Une caractéristique qui vous indique queAccept-Encoding peut être un bon candidat pourVary est qu'il n'a que deux ou trois valeurs possibles.

Des éléments tels queUser-Agent peuvent à première vue sembler être un bon moyen de différencier les navigateurs mobiles et de bureau pour servir différentes versions de votre site. Cependant, comme les chaînesUser-Agent ne sont pas standard, le résultat sera probablement de nombreuses versions du même contenu sur des caches intermédiaires, avec un taux de succès de cache très faible. L'en-têteVary doit être utilisé avec parcimonie, surtout si vous n'avez pas la possibilité de normaliser les requêtes dans les caches intermédiaires que vous contrôlez (ce qui peut être possible, par exemple, si vous exploitez un réseau de diffusion de contenu).

Impact des indicateurs de contrôle du cache sur la mise en cache

Ci-dessus, nous avons mentionné comment l'en-têteCache-Control est utilisé pour la spécification de la politique de cache moderne. Cet en-tête permet de définir un certain nombre d'instructions de stratégie différentes, plusieurs instructions étant séparées par des virgules.

Certaines des optionsCache-Control que vous pouvez utiliser pour dicter la politique de mise en cache de votre contenu sont:

  • no-cache: cette instruction spécifie que tout contenu mis en cache doit être revalidé à chaque demande avant d'être servi à un client. En fait, cela marque le contenu comme périmé immédiatement, mais lui permet d’utiliser des techniques de revalidation pour éviter de télécharger à nouveau l’ensemble de l’article.

  • no-store: cette instruction indique que le contenu ne peut en aucun cas être mis en cache. Ceci est approprié pour définir si la réponse représente des données sensibles.

  • public: Cela marque le contenu comme public, ce qui signifie qu'il peut être mis en cache par le navigateur et tous les caches intermédiaires. Pour les demandes utilisant l'authentification HTTP, les réponses sont marquées par défautprivate. Cet en-tête remplace ce paramètre.

  • private: Ceci marque le contenu commeprivate. Le contenu privé peut être stocké par le navigateur de l'utilisateur, mais doitnot être mis en cache par des parties intermédiaires. Ceci est souvent utilisé pour les données spécifiques à l'utilisateur.

  • max-age: ce paramètre configure l'âge maximum auquel le contenu peut être mis en cache avant de devoir revalider ou re-télécharger le contenu à partir du serveur d'origine. En substance, cela remplace l’en-têteExpires pour la navigation moderne et sert de base pour déterminer la fraîcheur d’un élément de contenu. Cette option prend sa valeur en secondes avec une durée de fraîcheur maximale valide d'un an (31536000 secondes).

  • s-maxage: Ceci est très similaire au paramètremax-age, en ce qu'il indique la durée pendant laquelle le contenu peut être mis en cache. La différence est que cette option est appliquée uniquement aux caches intermédiaires. La combinaison de ce qui précède permet une construction de politique plus flexible.

  • must-revalidate: Ceci indique que les informations de fraîcheur indiquées parmax-age,s-maxage ou l'en-têteExpires doivent être strictement respectées. Le contenu périmé ne peut être servi en aucune circonstance. Cela empêche l'utilisation du contenu en cache en cas d'interruptions du réseau et de scénarios similaires.

  • proxy-revalidate: Cela fonctionne de la même manière que le paramètre ci-dessus, mais ne s'applique qu'aux proxys intermédiaires. Dans ce cas, le navigateur de l’utilisateur peut éventuellement servir à traiter du contenu obsolète en cas d’interruption du réseau, mais les caches intermédiaires ne peuvent pas être utilisés à cette fin.

  • no-transform: cette option indique aux caches qu'ils ne sont en aucun cas autorisés à modifier le contenu reçu pour des raisons de performances. Cela signifie, par exemple, que le cache n'est pas en mesure d'envoyer des versions compressées du contenu qu'il n'a pas reçu du serveur d'origine compressé et n'est pas autorisé.

Ceux-ci peuvent être combinés de différentes manières pour obtenir différents comportements de mise en cache. Certaines valeurs mutuellement exclusives sont:

  • no-cache,no-store et le comportement de mise en cache normal indiqué par l'absence de l'un ou l'autre

  • public etprivate

L'optionno-store remplace lesno-cache si les deux sont présents. Pour les réponses aux demandes non authentifiées,public est implicite. Pour les réponses aux demandes authentifiées,private est implicite. Ceux-ci peuvent être remplacés en incluant l'option opposée dans l'en-têteCache-Control.

Développer une stratégie de cache

Dans un monde parfait, tout pourrait être mis en cache de manière agressive et vos serveurs ne seraient contactés que pour valider le contenu de temps en temps. Cependant, cela ne se produit pas souvent dans la pratique. Vous devez donc essayer de définir des règles de mise en cache saines visant à équilibrer la mise en cache à long terme et la réponse aux demandes d’un site en évolution.

Problèmes communs

Il existe de nombreuses situations dans lesquelles la mise en cache ne peut ou ne doit pas être mise en œuvre en raison de la manière dont le contenu est produit (généré dynamiquement par utilisateur) ou de la nature du contenu (informations bancaires sensibles, par exemple). Un autre problème rencontré par de nombreux administrateurs lors de la configuration de la mise en cache est la situation dans laquelle les anciennes versions de votre contenu sont hors d'usage, pas encore obsolètes, même si de nouvelles versions ont été publiées.

Ce sont des problèmes fréquemment rencontrés qui peuvent avoir de graves conséquences sur les performances du cache et sur la précision du contenu que vous diffusez. Cependant, nous pouvons atténuer ces problèmes en développant des stratégies de mise en cache anticipant ces problèmes.

Recommandations générales

Bien que votre situation dicte la stratégie de mise en cache que vous utilisez, les recommandations suivantes peuvent vous aider à prendre des décisions raisonnables.

Vous pouvez prendre certaines mesures pour augmenter votre taux d'accès au cache avant de vous soucier des en-têtes spécifiques que vous utilisez. Quelques idées sont:

  • Establish specific directories for images, css, and shared content: Placer le contenu dans des répertoires dédiés vous permettra de vous y référer facilement depuis n'importe quelle page de votre site.

  • Use the same URL to refer to the same items: Puisque met en cache la clé à la fois de l'hôte et du chemin d'accès au contenu demandé, assurez-vous de faire référence à votre contenu de la même manière sur toutes vos pages. La recommandation précédente rend cela beaucoup plus facile.

  • Use CSS image sprites where possible: les sprites d'image CSS pour des éléments tels que les icônes et la navigation réduisent le nombre d'aller-retour nécessaires pour rendre votre site et permettent à votre site de mettre en cache ce sprite unique pendant une longue période.

  • Host scripts and external resources locally where possible: Si vous utilisez des scripts javascript et d'autres ressources externes, envisagez d'héberger ces ressources sur vos propres serveurs si les en-têtes corrects ne sont pas fournis en amont. Notez que vous devrez être au courant de toutes les mises à jour apportées à la ressource en amont afin de pouvoir mettre à jour votre copie locale.

  • Fingerprint cache items: Pour le contenu statique comme les fichiers CSS et Javascript, il peut être approprié d'empreinte digitale de chaque élément. Cela signifie que vous devez ajouter un identifiant unique au nom de fichier (souvent un hachage du fichier) afin que, si la ressource est modifiée, le nouveau nom de la ressource puisse être demandé, ce qui permet aux demandes de contourner correctement le cache. Divers outils peuvent vous aider à créer des empreintes digitales et à en modifier les références dans les documents HTML.

En termes de sélection des en-têtes corrects pour différents éléments, les éléments suivants peuvent servir de référence générale:

  • Allow all caches to store generic assets: le contenu statique et le contenu qui n'est pas spécifique à l'utilisateur peuvent et doivent être mis en cache à tous les points de la chaîne de livraison. Cela permettra aux caches intermédiaires de répondre avec le contenu à plusieurs utilisateurs.

  • Allow browsers to cache user-specific assets: pour le contenu par utilisateur, il est souvent acceptable et utile d'autoriser la mise en cache dans le navigateur de l'utilisateur. Bien que ce contenu ne soit pas approprié pour la mise en cache de proxys de mise en cache intermédiaires, la mise en cache dans le navigateur permettra une récupération instantanée pour les utilisateurs lors de visites ultérieures.

  • Make exceptions for essential time-sensitive content: si votre contenu est sensible au facteur temps, faites une exception aux règles ci-dessus afin que le contenu obsolète ne soit pas diffusé dans des situations critiques. Par exemple, si votre site contient un panier, il doit refléter immédiatement les éléments qu'il contient. Selon la nature du contenu, les optionsno-cache ouno-store peuvent être définies dans l'en-têteCache-Control pour y parvenir.

  • Always provide validators: les validateurs permettent d'actualiser le contenu périmé sans avoir à télécharger à nouveau l'intégralité de la ressource. La définition des en-têtesEtag etLast-Modified permet aux caches de valider leur contenu et de le réutiliser s'il n'a pas été modifié à l'origine, ce qui réduit encore la charge.

  • Set long freshness times for supporting content: pour exploiter efficacement la mise en cache, les éléments qui sont demandés comme contenu de support pour répondre à une demande doivent souvent avoir un paramètre de fraîcheur long. Ceci est généralement approprié pour les éléments tels que les images et les CSS qui sont insérés pour restituer la page HTML demandée par l'utilisateur. La définition de durées de fraîcheur prolongées, associée à la prise d'empreintes digitales, permet aux caches de stocker ces ressources pendant de longues périodes. Si les ressources changent, l’empreinte digitale modifiée invalidera l’élément mis en cache et déclenchera le téléchargement du nouveau contenu. Jusque-là, les éléments de support peuvent être mis en cache dans le futur.

  • Set short freshness times for parent content: pour que le schéma ci-dessus fonctionne, l'élément contenant doit avoir des temps de fraîcheur relativement courts ou peut ne pas être mis en cache du tout. C'est généralement la page HTML qui appelle l'autre contenu d'assistance. Le code HTML lui-même sera téléchargé fréquemment, ce qui lui permettra de réagir rapidement aux changements. Le contenu de support peut alors être mis en cache de manière agressive.

L'essentiel est de trouver un équilibre qui favorise la mise en cache agressive dans la mesure du possible, tout en laissant des possibilités d'invalider les entrées à l'avenir lorsque des modifications sont apportées. Votre site aura probablement une combinaison de:

  • Éléments mis en cache de manière agressive

  • Articles mis en cache avec une courte durée de fraîcheur et la possibilité de re-valider

  • Éléments qui ne doivent pas du tout être mis en cache

L'objectif est de déplacer le contenu dans les premières catégories lorsque cela est possible, tout en maintenant un niveau de précision acceptable.

Conclusion

Prendre le temps de veiller à ce que votre site dispose de stratégies de mise en cache appropriées peut avoir un impact significatif sur votre site. La mise en cache vous permet de réduire les coûts de bande passante associés à la distribution répétée du même contenu. Votre serveur sera également capable de gérer une plus grande quantité de trafic avec le même matériel. Peut-être plus important encore, les clients bénéficieront d’une expérience plus rapide sur votre site, ce qui les incitera peut-être à revenir plus souvent. Bien que la mise en cache Web efficace ne soit pas une solution miracle, la mise en place de stratégies de mise en cache appropriées peut vous apporter des gains mesurables avec un minimum de travail.