Optimisation des caches de site AEM

L’optimisation de la mise en cache dans votre architecture AEM est l’un des moyens les plus rapides pour obtenir un gain de performances important. Cet article explique comment optimiser les différents caches disponibles dans une architecture AEM.

Description description

Environnement

Adobe Experience Manager

Problèmes/symptômes

Comment optimiser les caches AEM site ?

Architecture AEM et mise en cache

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

Résolution resolution

A. Mise en cache du navigateur

Le premier niveau de cache qu’un utilisateur 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 le Cache-Control: max-age=… response header. Le paramètre max-age indique au navigateur combien de secondes il doit mettre en cache le fichier avant de tenter de "revalider" ou de le demander à nouveau sur le site. Ce concept de cache max-age est généralement appelé "expiration du cache" ou TTL ("durée de vie").

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 : la directive privée dans l’en-tête Cache-Control fait en sorte que le fichier ne soit mis en cache que dans le navigateur, et non dans les caches intermédiaires tels que les CDN. Une utilisation pratique de cette directive serait si votre page comprend du contenu personnalisé/spécifique à l’utilisateur.

    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 un TTL différent pour les caches partagés, tels que les CDN. Lorsque cette valeur est définie, le navigateur utilise ce qui est défini dans max-age et d’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 sous HTTP/1.0 et peuvent avoir un impact sur la mise en cache. Ces en-têtes sont Expires 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 (réponse) / If-None-Match} en-têtes (requête).

Attention sur le test du navigateur :

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

Remarque sur le dispatcher :

Il existe un problème avec AEM Dispatcher v4.2.3 et les versions antérieures où le /enableTTL ne met en cache que l’utilisation de la directive max-age. Cela signifie que même si 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 versions ultérieures.

B. Mise en cache CDN

Un CDN ou "Content Delivery Network" 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 et la distance du réseau de l’ordinateur de l’utilisateur jusqu’à votre contenu, réduisant ainsi le "temps de voyage aller-retour" (RTT). La TTF correspond au temps nécessaire au navigateur pour envoyer une requête à votre site et recevoir une réponse. La concurrence dans l’espace du fournisseur de réseau CDN a rendu les réseaux CDN très rentables. Cela facilite la décision d’utiliser un réseau de diffusion de contenu pour votre site. Si vous n'utilisez pas encore de réseau de diffusion de contenu, vous devez vraiment en incorporer un sur votre site.

Il existe de nombreux fournisseurs de réseau de diffusion de contenu, chacun d’eux offre différentes fonctionnalités et configurations.

Comment fonctionne la mise en cache CDN ?

Les CDN mettent en cache le contenu en suivant des règles similaires aux navigateurs. Ils s'appuient sur l'en-tête HTTP Cache-Control response et retombent généralement dans l'en-tête Expires si aucun en-tête Cache-Control n'est trouvé.

La plupart des CDN offrent un moyen de déclencher un vidage manuel du cache.  Dans de nombreux cas, les vidages de cache ont un certain délai (par exemple, 15 minutes) en ce qui concerne la propagation vers tous les serveurs Edge contenant vos fichiers.

Optimisation de l’utilisation du réseau de diffusion de contenu

Pour vous assurer que vous mettez en cache les fichiers de manière optimale dans le réseau de diffusion de contenu, procédez comme suit :

  1. Utilisez un réseau de diffusion de contenu qui prend en charge les directives stale-while-revalidate et stale-if-error dans l'en-tête Cache-Control.

    • stale-while-revalidate - Cette directive indique au réseau de diffusion de contenu de servir l’ancienne version (déjà mise en cache) du fichier pendant qu’il en récupère une nouvelle une fois que le fichier de cache a expiré.
    • stale-if-error - De la même manière, cette directive indique au réseau de diffusion de contenu de servir l’ancienne version (déjà mise en cache) du fichier lorsque l’origine répond avec une erreur lors de la revalidation.
  2. GZip compresse les réponses pour tous les types de fichiers qui ne sont pas pré-compressés.

    Vous devez le faire à partir du niveau du Dispatcher. Vous réduirez ainsi le nombre d’octets envoyés au réseau CDN. Les CDN sont généralement chargés par octets transférés, de sorte que la compression des réponses réduit les coûts.

    • Activez la compression GZip au niveau de Dispatcher : Apache - utilisez mod_deflate. Faites attention à l’utilisation de mod_deflate de Vary. Dans certains cas, l’en-tête Vary peut faire que le réseau de diffusion de contenu et le navigateur ignorent entièrement la mise en cache.

    • 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. Les compresser à la volée au niveau du serveur web coûte très cher en 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 de diffusion de contenu prend en charge Edge-side Includes (ESI), utilisez cette fonctionnalité. Les composants AEM peuvent être fragmentés à l’aide de l’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 dans quelques parties de la page. Dans ce 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 de diffusion de contenu populaires

Voici une liste de certains fournisseurs de réseau de diffusion de contenu populaires :

Il y en a plusieurs autres, chacune avec des fonctionnalités différentes.

Attention :

Faites attention à l’en-tête de réponse Vary. Dans certains cas, Vary peut entraîner le contournement de la mise en cache du réseau de diffusion de contenu et du navigateur. En règle générale, évitez d’ajouter Vary sauf Vary: Accept-Encoding (appliqué uniquement lorsque la réponse est compressée par gzip). En d’autres termes, si vous devez "varier" la sortie d’une réponse, utilisez une URL différente.

Par exemple, si vous disposez d’une version différente de l’HTML pour mobile par rapport au poste de travail, utilisez une autre URL. Cela permet aux CDN et aux navigateurs de mettre en cache plus efficacement.

C. Mise en cache AEM Dispatcher

Si le cache du réseau de diffusion de contenu a expiré, la demande atteint le cache du Dispatcher AEM. À ce niveau, de nombreuses actions peuvent être entreprises pour optimiser la mise en cache.

Comme il s’agit d’une rubrique plus importante, consultez cet article pour plus d’informations sur l’optimisation du cache du dispatcher.

D. Instances Publish AEM

Au niveau de l’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. Last-Modified - Si le contenu de la page est relativement statique, par exemple un article, vous pouvez définir son en-tête de dernière modification sur la date/heure cq:lastModified (dernière fois que l’article a été modifié). 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 de l’utiliser 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 la page. Cela peut être défini en tant que propriété sur le noeud jcr:content de la page sur l’instance de création. Lorsque des 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. Toutefois, si la page est quelque peu dynamique ou référence un contenu important, l’ETag doit être omis (ou calculé).
  2. Si le site comporte du contenu personnalisé/dynamique :

    1. Utilisez Apache Sling Dynamic Includes pour diviser 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 réalisée à l’aide des technologies suivantes :

        • Inclusions côté Edge (ESI) sur le réseau de diffusion de contenu
        • Server-side Includes (SSI) sur le serveur web
        • Code JavaScript et XML asynchrone (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. Certaines parties de la page relativement statiques peuvent être mises en cache pendant une période beaucoup plus longue.

    2. Envisagez d’utiliser la fonction Cache HTTP d’ACS Commons.

  3. Optimisez les bibliothèques clientes.

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

    2. Si les fichiers de la bibliothèque cliente sont préminifiés, désactivez la minification sur cette bibliothèque cliente. Modifiez le noeud cq:ClientLibraryFolder :

      1. Définissez la propriété jsProcessor de type String[ ] avec la valeur min:none
      2. et définissez la propriété cssProcessor de type String[ ] avec la valeur min:none
      3. Voir plus de détails, ici.
    3. Incorporer les bibliothèques clientes pour minifier et réduire les fichiers js et css.

    4. Implémentez versioned-clientlibs d’ACS Commons pour permettre au CDN et à Dispatcher de mettre en cache les fichiers js et css pendant une plus longue période.

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