CDN expliqué : à quoi sert un réseau de diffusion de contenu | We.Inc
Comment un CDN copie vos fichiers sur des serveurs edge proches des visiteurs, ce que signifient un cache hit et un cache miss, et quels en-têtes Cache-Control décident de ce que l'edge peut conserver.
Un réseau de diffusion de contenu est un ensemble de serveurs répartis dans le monde qui conservent des copies des fichiers de votre site. Les visiteurs reçoivent la réponse d'un serveur edge proche au lieu de votre origine, donc les pages se chargent plus vite et votre propre serveur traite beaucoup moins de requêtes. Les en-têtes Cache-Control décident de ce que l'edge peut stocker.
Le vocabulaire du CDN, une ligne par terme
Terme
Signification
Origine
Votre propre serveur ou stockage, où se trouvent les vrais fichiers
Edge
Un serveur du CDN proche du visiteur qui répond à la place de l'origine
Cache hit
L'edge avait déjà une copie fraîche et a répondu sans interroger l'origine
Cache miss
L'edge n'avait rien d'utilisable, a récupéré le fichier à l'origine, puis l'a peut-être stocké
Purge
Demander au CDN de supprimer les copies stockées pour que la requête suivante récupère les nouvelles
Sur internet, la distance coûte du temps : chaque nouvelle connexion exige plusieurs allers-retours avant l'arrivée du premier octet. Un CDN raccourcit ces trajets en répondant depuis un point proche du lecteur. Ce guide explique comment cela fonctionne, ce que cela ne peut pas faire et comment vos en-têtes le contrôlent, avec un simulateur à essayer.
Choisissez des directives Cache-Control dans le simulateur pour voir si un navigateur et un edge de CDN peuvent stocker la réponse, et pendant combien de temps.
Copiez la ligne d'en-tête obtenue pour la configuration de votre serveur ou de votre hébergement.
Lisez le tableau de référence pour choisir des valeurs adaptées au HTML, aux ressources hachées et aux pages privées.
Après un déploiement, purgez le CDN ou comptez sur de nouveaux noms de fichiers pour que les visiteurs reçoivent la mise à jour.
Ajoutez un hash du contenu aux noms de fichiers, comme app.3f9a1c.js, et mettez-les en cache pour un an avec immutable. Un nouveau build produit de nouveaux noms, donc rien de périmé n'est servi.
Gardez le HTML sur une courte durée partagée ou revalidez-le, car son URL ne change jamais d'une version à l'autre.
Ne laissez jamais un CDN stocker des pages qui affichent les données de compte d'une personne. Marquez-les private ou no-store.
Charger une bibliothèque depuis un CDN public n'évite plus un second téléchargement : les navigateurs partitionnent désormais leur cache par site pour la confidentialité.
Questions fréquentes
Un CDN rend-il tous les sites plus rapides ?
Généralement, pour les visiteurs éloignés de votre serveur, car les allers-retours sont plus courts et les connexions s'établissent à proximité. Il peut ajouter un coût s'il introduit un domaine supplémentaire à résoudre et à contacter, c'est pourquoi tout servir depuis votre propre domaine via le CDN vaut mieux que mélanger les hôtes.
Qu'est-ce que s-maxage ?
Une directive Cache-Control qui fixe la durée de fraîcheur uniquement pour les caches partagés comme les CDN. Elle remplace max-age sur l'edge tandis que les navigateurs continuent d'utiliser max-age, ce qui permet de laisser l'edge garder une page une heure et le navigateur une minute.
Un CDN peut-il mettre en cache des pages dynamiques ?
Oui, si la réponse est la même pour tout le monde. Même quelques secondes de cache peuvent absorber un pic de trafic. Les réponses qui diffèrent selon l'utilisateur connecté ne doivent pas être stockées dans un cache partagé.
Un CDN est-il un risque de sécurité ?
C'est un intermédiaire de plus sur le chemin de votre contenu. Si vous chargez des scripts depuis un CDN tiers, ajoutez un hash Subresource Integrity pour que le navigateur refuse un fichier modifié.
Dois-je ajouter un CDN moi-même ?
Beaucoup de plateformes d'hébergement servent déjà les sites publiés via un CDN. Lisez la documentation de votre hébergeur avant d'en ajouter un second par-dessus, car deux couches de cache compliquent les purges et le débogage.
Ce qui se passe lors d'une requête
Le résolveur du visiteur renvoie l'adresse d'un edge proche. L'edge cherche l'URL dans son stockage. En cas de hit, il répond immédiatement. En cas de miss, il interroge votre origine, transmet la réponse et en garde une copie si les en-têtes le permettent.
Les edges maintiennent aussi des connexions ouvertes vers l'origine, donc même un miss est souvent plus rapide qu'un visiteur qui se connecte à votre serveur depuis l'autre bout du monde.
Ce qu'un CDN ne peut pas corriger
Les requêtes de base de données lentes, le JavaScript lourd et les images trop grandes restent lents quand ils sont servis depuis un edge. Un CDN supprime la distance, pas le travail.
Il ajoute aussi un élément de plus qui peut tomber en panne. Si le CDN subit une panne, tous les sites qui en dépendent sont touchés, donc il vaut la peine de suivre les pages de statut et de prévoir ce cas.
Les directives Cache-Control qui comptent sur l'edge
Ce que chaque directive indique aux navigateurs et aux CDN
Directive
Navigateur
Edge du CDN
max-age=N
Frais pendant N secondes
Frais pendant N secondes sauf si s-maxage est défini
s-maxage=N
Ignoré
Frais pendant N secondes, remplace max-age
Peut stocker
Peut stocker, même avec un en-tête Authorization
Peut stocker
Ne doit pas stocker
Ne doit pas stocker
Ne doit pas stocker
Pas de revalidation tant que c'est frais
Pas de revalidation tant que c'est frais
stale-while-revalidate=N
Peut servir une version périmée pendant N secondes en rafraîchissant
Pareil, si le CDN le prend en charge
Recettes d'en-têtes par type de fichier
Trois politiques courantes
Les ressources hachées vivent un an, le HTML se rafraîchit sur l'edge chaque minute, et les pages de compte ne passent jamais par un cache partagé.
Simulateur Cache-Control
Choisissez des directives et voyez qui peut conserver la réponse.
max-age (secondes)
s-maxage (secondes, vide pour aucun)
Partage
Public, privé ou no-store
Ajouter immutable
Navigateur
Edge du CDN
Peut stocker, frais pendant {n} secondes
Ne doit pas stocker
Peut stocker, mais doit vérifier auprès du serveur avant de réutiliser