Configurer la mise en cache de sortie IIS 7

par Tali Smith

Internet Information Services (IIS) inclut une fonctionnalité de mise en cache de sortie qui peut mettre en cache du contenu PHP dynamique (ou la sortie de votre Microsoft® ASP.NET ou ASP classique, ou d’autres pages dynamiques) dans la mémoire. Cela peut générer d’énormes améliorations du niveau de performance, car le script utilisé pour générer la sortie dynamique n’a pas besoin d’être exécuté pour chaque requête. Le cache peut modifier la sortie mise en cache en fonction des valeurs de chaîne de requête ainsi que des en-têtes HTTP envoyés du client au serveur. Le cache est également intégré au pilote en mode noyau Http.sys, ce qui améliore le niveau de performance.

Quand utiliser la mise en cache de sortie

Le contenu web peut être divisé en deux catégories principales : le contenu statique et le contenu dynamique.

  • Le contenu statique ne change pas de requête en requête. Le contenu qui est retourné au navigateur web est toujours le même. Les fichiers HTML, JPG ou GIF sont quelques exemples de contenu statique.
  • Le contenu dynamique est une sortie qui change avec chaque requête. ASP.NET ou le contenu PHP sont quelques exemples de contenu dynamique.

Entre ces deux catégories, il existe un contenu semi-dynamique. Imaginez une page de ASP.NET dynamique qui exécute une interrogation de base de données. Il n’y a aucune raison d’exécuter cette interrogation pour chaque requête si les tables de la base de données sous-jacentes changent rarement.

IIS met automatiquement en cache le contenu statique (par exemple, les pages HTML, les images et les feuilles de style), car ces types de contenu ne changent pas de requête en requête. IIS détecte également les modifications apportées aux fichiers lorsque vous effectuez des mises à jour et IIS vide le cache si nécessaire.

La fonctionnalité de mise en cache de sortie IIS cible le contenu semi-dynamique. Elle vous permet de mettre en cache les réponses statiques pour les requêtes dynamiques et d’augmenter la scalabilité.

Notez que les pages dynamiques ne peuvent pas toutes tirer parti de la mise en cache de sortie. Les pages hautement personnalisées (telles que les transactions de panier d’achat ou de commerce électronique) ne sont pas de bons candidats, car la sortie dynamique n’est probablement pas demandée de manière répétée, et la mémoire utilisée pour mettre en cache le contenu serait gaspillée. Il n’est pas possible de mettre en cache le contenu généré à la suite d’une requête de type POST vers un formulaire HTML.

Les meilleurs candidats pour la mise en cache de sortie sont les pages qui génèrent des données dynamiquement, mais qui ne sont pas susceptibles de changer de requête en requête en fonction de l’URL ou des informations d’en-tête. Par exemple, les applications de type galerie de photos qui redimensionnent dynamiquement les images pour l’affichage dans une page web sont des candidats parfaits pour la mise en cache de sortie, car mettre les données en cache évite au serveur d’avoir à re-traiter le redimensionnement d’image pour chaque requête. Un autre bon exemple d’un type d’application qui peut tirer parti de la fonctionnalité de mise en cache de sortie est une application boursière.

Sélectionner des stratégies de mise en cache

IIS prend en charge deux types de stratégies de mise en cache :

  • varyByQuerystring, dans lequel l’URL est la même, mais la valeur de la chaîne de requête varie.
  • varybyHeaders, qui peut modifier la mise en cache en fonction des en-têtes HTTP envoyés du client au serveur.

Invalider le cache

Avec le contenu dynamique, les données peuvent changer fréquemment et vous devez vider le cache, ce qui permet à de nouvelles données d’être récupérées et re-mises en cache. Notez que, même si les données changent aussi fréquemment que toutes les secondes, il peut toujours être utile de mettre en cache les données ; un site peut recevoir des centaines de requêtes par seconde ou plus, et la mise en cache peut réduire les déplacements vers la base de données pour récupérer des données, en évitant au serveur web et au serveur de base de données un travail supplémentaire.

IIS prend en charge deux façons d’invalider le contenu dynamique :

  • Utiliser une période d’expiration simple : la propriété de configuration est CacheForTimePeriod.
  • Détecter une modification de la ressource sous-jacente : la propriété de configuration est CacheUntilChange. Utilisez ce type de schéma d’invalidation uniquement lorsque vous souhaitez vider le cache quand la ressource sous-jacente change.

Configurer la validité du cache

Même si vous activez la mise en cache de sortie, IIS ne met pas immédiatement les requêtes en cache. Elle doit être demandée plusieurs fois avant qu'IIS ne considère qu'une requête est « digne du cache ». La validité du cache peut être configurée via la section ServerRuntime décrite dans l’article Classe ServerRuntimeSection.

Deux propriétés déterminent la validité du cache :

  • frequentHitTimePeriod
  • frequentHitThreshold

Une requête n'est mise en cache que si plus de <frequentHitThreshold> requêtes pour une URL pouvant être mise en cache arrivent pendant la <frequentHitTimePeriod>. Le paramètre par défaut de frequentHitTimePeriod est de 10 secondes. Le paramètre par défaut de frequentHitThreshold est de 2 accès.

Configurer la mise en cache de sortie via le Gestionnaire IIS

Le cache est assez facile à configurer à l’aide de la fonctionnalité d’interface utilisateur dans le nouvel outil d’administration IIS.

  1. Depuis le menu Démarrer, cliquez sur Outils d’administration, puis cliquez sur Gestionnaire Internet Information Services (IIS).

  2. Dans l’arborescence située à gauche, recherchez votre application.

  3. Sélectionnez l’élément de menu Mise en cache de sortie.

  4. Dans la colonne de droite, cliquez sur Ajouter dans le menu Action. Vous pouvez ajouter votre règle de mise en cache de sortie ici.

  5. Dans le champ Extension de nom de fichier, par exemple, tapez .php, puis sélectionnez Mise en cache en mode utilisateur.

  6. Cliquez sur Avancé, puis sélectionnez la case à cocher Variable(s) de chaîne de requête.

  7. Entrez la ou les variables appropriées dans la zone de texte Variable(s) de chaîne de requête.

    Capture d’écran de la boîte de dialogue Ajouter une règle de cache, de la page Mise en cache de sortie et de la règle de cache de sortie avancée Paramètres.

    Figure 1 : exemple de mise en cache de sortie

Configurer la mise en cache de sortie via le fichier Web.config

Vous pouvez également configurer la fonctionnalité de mise en cache dans le fichier web.config local, qui se trouve dans le répertoire de contenu. Vous trouverez ci-dessous un exemple de la configuration nécessaire pour une page ShowStockPrice.asp avec un paramètre varyByQueryString de * (ce qui signifie mettre en cache toutes les variantes uniques des paramètres querystring) et un délai d’expiration d’une seconde.

<configuration> 
     <location path="showStockPrice.asp">     
       <system.webserver>        
         <caching>         
           <profiles>
             <add varybyquerystring="*"location="Any"
               duration="00:00:01" policy="CacheForTimePeriod"            
               extension=".asp">
           </profiles>
         </caching>
       </system.webserver>
     </location>
</configuration>

Si vous souhaitez mettre en cache ces données dans le noyau pour des performances encore plus rapides, vous devez simplement modifier l’attribut de stratégie en kernelCachePolicy.

Remarque

Microsoft ASP.NET inclut déjà une fonctionnalité de cache de sortie ; la fonctionnalité de cache de sortie IIS fonctionne en parallèle avec le cache ASP.NET, et fonctionne pour tous les types d’applications.

Vérifier les compteurs de performances

Pour vérifier le niveau de performance du cache de sortie, examinez les compteurs du cache de sortie dans l’analyseur de performances et de fiabilité.

  1. Depuis le menu Démarrer, cliquez sur Outils d’administration, puis sur Analyseur de performances et de fiabilité. (Sur Windows Vista® ou Windows® 7, les outils d’administration se trouvent dans le Panneau de configuration.)
  2. Sélectionnez Analyseur de performances dans l'arborescence de droite, puis cliquez sur + dans la barre d'outils.
  3. Accédez au compteur Cache du service web, puis cliquez dessus pour l’ouvrir.
  4. Ajoutez le compteur Total d’URI mis en cache.

Si vous exécutez un test de niveau de performance, vous pouvez voir que le nombre d’URI mis en cache augmente avec le nombre d’éléments que vous demandez.

Utiliser la mise en cache en mode noyau

La mise en cache de sortie IIS prend en charge deux stratégies de mise en cache :

  • La stratégie de mise en cache de sortie en mode utilisateur, qui utilise un cache qui réside dans un processus de travail IIS.
  • La stratégie de mise en cache en mode noyau, qui utilise un cache qui réside dans Http.sys, un pilote en mode noyau.

Mettre votre contenu en cache en mode noyau vous permet de accélérer les performances du site web. Vous trouverez un exemple d’utilisation de la mise en cache en mode noyau dans l’article Mise en cache de sortie IIS.

Notez qu’il existe deux différences significatives entre la mise en cache de sortie en mode utilisateur et en mode noyau.

  • La mise en cache de sortie en mode noyau ne prend pas en charge les modules et fonctionnalités qui doivent s'exécuter en mode utilisateur, comme l'authentification ou l'autorisation. Par exemple, si des schémas d’authentification tels que l’authentification de base ou l’authentification Windows® sont activés, la stratégie de mise en cache ne fonctionne pas. Le contenu est servi, mais pas mis en cache. Vous trouverez plus d’informations sur la raison pour laquelle les réponses peuvent ne pas être mises en cache en mode noyau dans cet article de la Base de connaissances.
  • Le cache de sortie en mode noyau prend en charge l'attribut varyByHeaders, mais pas varyByQuerystring.

Dépanner la mise en cache

Mise en mémoire tampon des échecs des évènements de requête (Failed Request Event Buffering/FREB) est la meilleure façon de déterminer si votre requête est mise en cache ou non ; vous pouvez également savoir pourquoi une requête n’est pas mise en cache. Par exemple, l’évènement HTTPSYS_CACHEABLE dans un journal FREB peut vous indiquer qu’une requête n’est pas mise en cache, car le cache en mode noyau n’est pas activé.

La commande suivante peut être utilisée pour découvrir quel contenu est mis en cache en mode noyau :

netsh http show cachestate

Vous pouvez définir le cache de sortie pour qu’il ne mette en cache que votre page par défaut (la page la plus fréquemment demandée) :

  1. Créez un fichier appelé default.aspx dans le répertoire %systemdrive%\inetpub\wwwroot\<votre application> et ajoutez le code suivant :

    <%=DateTime.Now%>
    
  2. Depuis le menu Démarrer, cliquez sur Outils d’administration, puis cliquez sur Gestionnaire Internet Information Services (IIS).

  3. Utilisez l’arborescence sur le côté gauche pour accéder à votre application.

  4. Cliquez sur Affichage du contenu en bas de la page.

  5. Sélectionnez votre document par défaut, par exemple, la page default.aspx.

  6. Dans le menu Actions à droite, cliquez sur la vue Basculer vers les fonctionnalités. Chaque paramètre que vous configurez n’est désormais appliqué qu’au document par défaut.

  7. Ouvrez le paramètre Règles de mise en cache de sortie.

  8. Ajoutez .aspx en tant qu’extension de fichier.

  9. Sélectionnez Mise en cache en mode noyau, sélectionnez À intervalles de temps, activez les Analyser les fichiers mis en cache et tapez un intervalle de temps, comme 00:00:30.

  10. Accédez à http://localhost//<your application> avec Windows® Internet Explorer®. En actualisant constamment la page (appuyez sur Ctrl+F5 pour vous assurer que vous n’utilisez pas le cache du navigateur), vous voyez que l'heure ne changera pas pendant 30 secondes.

Remarque

Cet article est basé sur les informations de l’article «Mise en cache de sortie IIS 7 pour le contenu dynamique : accélérer vos applications ASP et PHP par Bill Staples, publié le 2 mai 2007.

Voir aussi