Optimisation des caches de site AEM

L’optimisation de la mise en cache au sein de votre architecture AEM est l’un des moyens les plus rapides d’améliorer considérablement les performances. Cet article explique comment optimiser les différents caches disponibles dans une architecture AEM.

Description description

Environnement

Adobe Experience Manager 6.5

Problèmes/Symptômes

Comment optimiser les caches de site d’AEM ?

Architecture et mise en cache AEM

Dans toutes les architectures AEM, l’utilisateur rencontre plusieurs couches de cache lors de sa visite du site. Il existe 4 couches de cache à prendre en compte dans une architecture AEM standard. Cela inclut le navigateur web, le réseau CDN, Dispatcher et les instances AEM.

Résolution resolution

A. Mise en cache du navigateur

Le premier niveau de cache qu’un utilisateur ou une utilisatrice rencontre lors d’une visite répétée de votre site est son propre navigateur. La mise en cache au niveau du navigateur est généralement effectuée via la réponse [en-tête] () Cache-Control: max-age=…https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control. Le paramètre max-age indique au navigateur combien de secondes il doit mettre le fichier en cache avant de tenter de « revalider » ou de le demander à nouveau à partir du site. Ce concept de cache max-age est généralement appelé « Expiration du cache » ou TTL (« Time to Live »).

Il existe différentes options (ou « directives ») dans l’en-tête Cache-Control qui affectent la manière dont la mise en cache se produit. Voici quelques directives courantes :

  1. private : directive privée dans l’en-tête Cache-Control afin que le fichier soit uniquement mis en cache dans le navigateur, et non dans les caches intermédiaires tels que les réseaux de diffusion de contenu. Cette directive peut être utile si votre page inclut du contenu personnalisé/spécifique à l’utilisateur ou à l’utilisatrice.

    Exemple d’utilisation : Cache-Control: max-age=300, private

  2. s-maxage : la directive s-maxage de l’en-tête Cache-Control vous permet de définir une durée de vie différente pour les caches partagés tels que les réseaux CDN. Lorsque cette valeur est définie, le navigateur utilise ce qui est défini dans max-age et les autres caches respectent le paramètre s-maxage à la place.

    Exemple d’utilisation : Cache-Control: max-age=600, s-maxage=300

Les navigateurs modernes prennent tous en charge l’en-tête Cache-Control. Cependant, certains anciens en-têtes obsolètes existent depuis HTTP/1.0 et peuvent toujours avoir un effet sur la mise en cache. Ces en-têtes sont Expire et Pragma. Si vous n’avez pas besoin de prendre en charge de très anciens navigateurs, n’envoyez pas ces en-têtes de réponse.

Outre la mise en cache, la revalidation est également un concept important. La revalidation repose sur les en-têtes Last-Modified(response) / If-Modified-Since (request) et ETag (response) / If-None-Match (request).

Attention lors du test d’un navigateur :

Lors du test de la mise en cache dans Google Chrome, si vous effectuez un test via https et que vous disposez d’un certificat auto-signé, rien ne sera mis en cache. Chrome ne met pas en cache les réponses ni n’effectue de revalidation en cas de certificat non approuvé ou non valide.

Remarque sur Dispatcher :

Un problème se produit avec AEM Dispatcher v4.2.3 et les versions antérieures, où le /enableTTL ne met en cache que les à l’aide de la directive max-age. Cela signifie que même lorsque les directives private ou s-maxage sont définies, elles restent en cache si max-age est défini. Ce problème est résolu dans Dispatcher 4.2.4 et les versions ultérieures.

B. Mise en cache CDN

Un réseau CDN ou « réseau de diffusion de contenu » est un réseau distribué de serveurs web conçu pour mettre en cache et diffuser du contenu à partir de l’emplacement le plus proche de vos utilisateurs. Cela réduit les sauts réseau et la distance entre l’ordinateur de l’utilisateur et votre contenu, réduisant ainsi ​ « temps d’aller-retour » (RTT). Le RTT correspond au temps nécessaire au navigateur pour envoyer une requête à votre site et recevoir une réponse. La concurrence dans l'espace des fournisseurs de réseau CDN a rendu les réseaux CDN très rentables. Cela facilite la décision d’utiliser un réseau CDN pour votre site. Si vous n’utilisez pas encore de réseau CDN, vous devez absolument incorporer un réseau CDN à votre site.

Il existe de nombreux fournisseurs de réseau CDN, chacun offrant des fonctionnalités et des configurations différentes.

Comment fonctionne la mise en cache CDN ?

Les réseaux de diffusion de contenu mettent en cache du contenu selon des règles similaires aux navigateurs. Ils reposent sur l’en-tête Cache-Control HTTP response et reviennent généralement à l’en-tête Expires si aucun en-tête Cache-Control n’est trouvé.

La plupart des réseaux de diffusion de contenu offrent un moyen de déclencher un vidage manuel du cache.  Dans de nombreux cas, les vidages du cache présentent un certain retard (par exemple, 15 minutes) en ce qui concerne la propagation à tous les serveurs Edge qui contiennent vos fichiers.

Optimisation de l’utilisation du réseau CDN

Il existe quelques mesures à prendre pour vous assurer de mettre en cache les fichiers de manière optimale dans le réseau CDN :

  1. Utilisez un réseau CDN qui prend en charge les directives stale-while-revalidate et stale-if-error dans l’en-tête Cache-Controlheader.

    • stale-while-revalidate - cette directive indique au réseau de diffusion de contenu de diffuser l’ancienne version (déjà mise en cache) du fichier pendant qu’elle récupère une nouvelle version après l’expiration du fichier cache.
    • stale-if-error - de même, cette directive indique au réseau CDN de diffuser l’ancienne version (déjà mise en cache) du fichier lorsque l’origine répond avec une erreur lors de la revalidation.
  2. Compresser les réponses au format GZip pour tous les types de fichiers qui ne sont pas précompressés

    Vous devez effectuer cette opération au niveau du Dispatcher. Vous réduirez ainsi le nombre d’octets envoyés au réseau CDN. Les réseaux de diffusion de contenu se chargent généralement par octets transférés afin que la compression des réponses réduise le coût.

    • Activez la compression GZip au niveau du Dispatcher : Apache - utilisez mod_deflate. Attention à l'utilisation de la variable par mod_deflate. Dans certains cas, l’en-tête Vary peut entraîner l’omission complète de la mise en cache par le réseau CDN et le navigateur.

    • Microsoft IIS : utilisez Compression dynamique.

    • N’autorisez pas la compression gzip des fichiers volumineux ou déjà compressés. Notez que la plupart des formats d’image et vidéo sont déjà précompressés. Leur compression à la volée au niveau du serveur web s’accompagne d’un coût très élevé en termes de performances.

      • Sur Apache, cela peut être effectué via la directive AddOutputFilterByType : AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
      • Sur IIS, cela peut être contrôlé via la configuration < dynamicTypes>.
    • Si votre fournisseur de réseau CDN prend en charge les inclusions côté Edge (ESI), exploitez cette fonctionnalité. Les composants AEM peuvent être divisés à l’aide d’ESI. Pour ce faire, utilisez Apache \[ Sling Dynamic Includes\] ou implémentez une solution personnalisée. Cela s’avère utile lorsque vous disposez de pages assez statiques mais que vous diffusez du contenu plus dynamique en quelques parties de la page. Dans ces cas, vous divisez essentiellement la page en plusieurs fichiers CDN. Vous pouvez ainsi mettre en cache différentes parties de la page pendant différentes périodes.

Fournisseurs de réseau CDN populaires

Voici une liste de quelques fournisseurs de réseau CDN populaires :

Il y en a plusieurs autres, chacune avec des caractéristiques différentes.

Attention:

Veillez à l’en-tête de réponse Vary. Dans certains cas, Vary peut faire en sorte que le réseau CDN et le navigateur ignorent entièrement la mise en cache. En règle générale, évitez d’ajouter Vary à l’exception de Vary: Accept-Encoding (appliqué uniquement lorsque la réponse est compressée au format gzip). En d’autres termes, si vous devez « varier » la sortie d’une réponse, utilisez une autre URL.

Par exemple, si vous avez une version d’HTML différente pour les appareils mobiles et pour les ordinateurs de bureau, utilisez une autre URL. Cela permet aux réseaux de diffusion de contenu et aux navigateurs de se mettre en cache plus efficacement.

C. Mise en cache Dispatcher d’AEM

Si le cache du réseau CDN a expiré, la requête atteint le cache du Dispatcher AEM. À ce niveau, de nombreuses actions peuvent être entreprises pour optimiser la mise en cache. Pour connaître les étapes, voir Comment optimiser le cache de Dispatcher ?

D. Instances de publication AEM

Au niveau d’AEM, quelques actions sont nécessaires pour optimiser les différentes couches de cache :

  1. Définissez les en-têtes de réponse HTTP suivants qui ne sont pas définis par AEM par défaut.

    1. Cache-Control: max-age=… - Pour définir cet en-tête, ACS Commons - Dispatcher TTL peut être utilisé ou vous pouvez implémenter du code personnalisé pour le définir.
    2. Dernière modification ​ - Si le contenu de la page est relativement statique, tel qu’un article, vous pouvez définir son en-tête de dernière modification sur la date/l’heure cq:lastModified (dernière modification de l’article). Cependant, si la page est dynamique avec des résultats de requête JCR contenus dans le contenu du composant, il est préférable de la définir pour utiliser la date/l’heure actuelle.
    3. ETag - Si vous décidez d’utiliser cette option au lieu de Last-Modified, vous pouvez écrire un ReplicationEventListener qui écoute les activations de page et génère un hachage md5 du contenu de page. Elle peut être définie en tant que propriété sur le nœud jcr:content de la page sur l’instance de création. Lorsque les pages sont répliquées, elles sont envoyées aux instances de publication. Pour les composants de page dont le contenu est relativement statique, cela peut fonctionner. Cependant, si la page est quelque peu dynamique ou fait référence à un contenu volumineux, l’ETag doit être omis (ou calculé).
  2. Si le site comporte du contenu personnalisé/dynamique :

    1. Utilisez Apache Sling Dynamic Includes pour fractionner le contenu afin que différentes parties de la page puissent être mises en cache pendant différentes périodes.

      1. La mise en cache peut être effectuée avec les technologies suivantes :

        • Inclusions côté Edge (ESI) sur le réseau CDN
        • Inclusions côté serveur (SSI) sur le serveur web
        • JavaScript et XML asynchrones (AJAX) sur le navigateur
      2. Les composants de la page peuvent être divisés en requêtes distinctes qui peuvent être mises en cache pendant différentes périodes. Les parties de la page qui sont relativement statiques peuvent être mises en cache pendant des périodes beaucoup plus longues.

    2. Envisagez d’utiliser la fonctionnalité Cache HTTP de ACS Commons.

  3. Optimisez les bibliothèques clientes.

    1. Activez la minimisation sur les bibliothèques clientes.

    2. Si des fichiers de la bibliothèque cliente sont pré-minimisés, désactivez la minimisation sur cette bibliothèque cliente. Modifiez le nœud cq:ClientLibraryFolder :

      1. Définissez la propriété jsProcessor de type chaîne[ ] avec la valeur min:none
      2. et définissez la propriété cssProcessor de type chaîne[ ] avec la valeur min:none
      3. Pour plus d’informations, rendez-vous ici.
    3. Incorporez des bibliothèques clientes pour réduire au minimum les fichiers js et css.

    4. Implémentez versioned-clientlibs à partir d’ACS Commons pour permettre au réseau CDN et à Dispatcher de mettre en cache des fichiers js et css pour des périodes plus longues.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f