Partager via


Résolution des problèmes de compression IIS dans IIS 6 ou IIS 7.x

S’applique à : Internet Information Services 6.0, Internet Information Services 7.0 et versions ultérieures

Aperçu

L’activation de la compression HTTP pour vos applications web IIS 6 ou 7 est un moyen d’augmenter les performances du site.

La plupart des propriétés de compression requises pour gérer complètement IIS ne sont pas exposées par l’interface utilisateur utilisateur de l’administrateur. Il offre simplement un commutateur activé ou désactivé. Par conséquent, pour activer complètement la compression HTTP, vous devez utiliser un outil autre que le Gestionnaire IIS pour mettre à jour le fichier metabase.xml . L’outil le plus courant utilisé est adsutil.vbs, qui est inclus dans le répertoire d’installation IIS.

Cet article vous aide à configurer la compression et à identifier les raisons courantes pour lesquelles la compression IIS peut ne pas fonctionner dans IIS 6 et IIS 7.x.

Outils utilisés dans cet utilitaire de résolution des problèmes

  • Fiddler
  • Process Monitor
  • ACL de métabase
  • Trace FREB IIS 7

Vérification

Déterminer si la compression fonctionne

La seule façon de déterminer si le serveur IIS a envoyé une réponse compressée consiste à analyser une trace réseau de la demande cliente et de la réponse du serveur. La requête du client doit contenir l’en-tête de requête HTTP suivant :

HTTP: Accept-Encoding =gzip, deflate

Cela permet au serveur de savoir que le client est prêt à recevoir une réponse compressée et prend en charge la compression. En retour, une réponse compressée du serveur contient l’en-tête de réponse HTTP suivant et une valeur :

HTTP: Content-Encoding = gzip

Les captures d’écran suivantes montrent la sortie de l’outil Fiddler lorsque la compression ne fonctionne pas :

Capture d’écran de la compression HTTP définie sur Aucune compression sous l’onglet Transformateur.

Capture d’écran d’une section de compression HTTP désactivée sous l’onglet Transformateur.

Résolution des problèmes de compression

Procédez comme suit pour résoudre les problèmes de compression :

  1. Activez la compression dans IIS 6 ou IIS 7.

    Dans le Gestionnaire d’IIS, cliquez avec le bouton droit sur le nœud Sites web, sélectionnez Propriétés, puis sélectionnez Services.

    Capture d’écran de la compression HTTP avec Compresser les fichiers statiques sélectionnés et la taille maximale du répertoire temporaire définie sur illimité.

    Capture d’écran des options de compression activées avec les valeurs par défaut.

  2. Spécifiez le dossier de compression et les autorisations.

    IIS stocke les fichiers compressés dans un dossier, qui peut être configuré. Par défaut, il s’agit d’IIS %windir%\IIS Temporary Compressed Files 6 et %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files pour IIS 7.

    IIS_WPG(IIS_IURS pour IIS 7) doit disposer d’une autorisation de contrôle total pour ce dossier. Utilisez Process Monitor pour résoudre ce type de problème d’autorisation.

  3. Vérifiez si la compression est activée dans Metabase.xml.

    La compression n’est pas activée dans le métabase sur les nœuds appropriés. Il existe trois nœuds de métabase pour la configuration de compression :

    • w3svc/filters/compression/parameters
    • w3svc/filters/compression/gzip
    • w3svc/filters/compression/deflate

    La configuration du /parameters nœud est obligatoire. Ensuite, vous pouvez configurer soit /gzip soit nœud /deflate , soit les deux. Cela signifie que la configuration des nœuds gzip, deflate ou de paramètres ne fonctionne pas. Si vous configurez les nœuds et /gzip les /parameters nœuds, le schéma de compression Gzip est activé. Si vous configurez les nœuds et /deflate les /parameters nœuds, le schéma de compression Deflate est activé. Enfin, si vous configurez les trois nœuds, la compression GZip et la compression Deflate sont activées.

  4. Vérifiez l’autorisation de métabase pour IIS 6.

    Par défaut, il dispose des IIS_WPG autorisations Lecture, Lecture non sécurisée, Énumération des clés et Écriture dans le /LM/W3SVC/Filters.

    IIS ne pourra pas initialiser la compression si les autorisations ont été supprimées en raison d’un changement inattendu ou si la sécurité se renforce.

    Utilisez metaacl.vbs pour vérifier et modifier l’ACL de métabase IIS 6. Pour plus d’informations, consultez la liste de contrôle d’accès metabase par défaut.

    Si l’identité du pool d’applications (ou le IIS_WPG groupe en général) n’a pas d’accès en lecture et écriture à la clé de métabase W3SVC ou Filtres, une condition d’échec est COMPRESSION_DISABLED consignée dans une trace De suivi d’entreprise pour Windows (ETW).

    ETW Trace

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Vérifiez si la compression dynamique ou statique est désactivée dans Metabase.xml.

    À chacun des trois nœuds de configuration (/parameters, /gzipet /deflate), vous avez la possibilité d’activer la compression statique et/ou dynamique. Pour activer la compression statique pour les types de fichiers tels que .txt et .html, vous devez définir la HcDoStaticCompression clé 1 sur (ou TRUE). Pour activer la compression dynamique pour les types de fichiers tels que .asp, .aspx, .asmx ou .exe, vous devez définir la HcDoDynamicCompression clé 1 sur (ou TRUE).

    Par exemple, pour définir la compression dynamique sur le /parameters nœud, exécutez la commande suivante à l’aide d’adsutil.vbs :

    cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
    

    La sortie de la commande précédente ressemble à ceci :

    HcDoDynamicCompression          : (BOOLEAN) True
    

    Dans IIS7

    <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
    
  6. Vérifiez si le type de fichier que vous souhaitez compresser est répertorié dans les sections d’extensions de fichier appropriées sur les nœuds et /deflate les /gzip nœuds.

    Après avoir activé la compression avec les clés et/ou HcDoStaticCompression les HcDoDynamicCompression clés, spécifiez les types de fichiers qui doivent être réellement compressés. Par défaut, la compression STATIC utilise des types de fichiers tels que .htm, .html et .txt et la compression DYNAMIC utilise .asp, .dll et .exe. Si vous souhaitez compresser différents types de fichiers, par exemple .aspx, ajoutez-le à la section d’extension de fichier appropriée dans les /gzip nœuds et-ou /deflate , selon le type de compression que vous utilisez. Pour la compression de fichier statique (par exemple, .html, txt et xml), ajoutez les extensions de fichier à la HcFileExtensions propriété. Pour la compression dynamique (par exemple, .asp, .aspx et .asmx) ajoutez-la à la HcScriptFileExtension propriété.

    Pour les fichiers statiques

    adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
    
    adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
    

    La commande précédente affiche la sortie suivante :

    HcFileExtensions : (LIST)  (3 Items)
    "htm"
    "html"
    "txt"
    

    Pour les fichiers dynamiques

    adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
    

    La commande précédente affiche la sortie suivante :

    HcFileExtensions : (LIST)  (4 Items)
    "asp"
    "dll"
    "exe"
    "aspx"
    

    Dans IIS7

    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="1000">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    </httpCompression>
    <system.web.extensions>
    <scripting>
        <scriptResourceHandler enableCompression="false" />
    </scripting>
    </system.web.extensions>
    

    Note

    Vous devez configurer le ou HcScriptFileExtensions les HcFileExtensions propriétés avec la syntaxe correcte. Les espaces de fin ou les guillemets inutiles ou les retours chariot entraînent l’erreur de configuration de la propriété. Malheureusement, adsutil.vbs n’affiche pas d’erreur si vous ajoutez un espace supplémentaire, vous devez donc être très prudent. En outre, vous ne pouvez pas copier ou coller les valeurs dans une invite de commandes ou dans le fichier metabase.xml (métabase direct-edit) et devez le taper manuellement.

  7. Vérifiez si la compression est définie au niveau maître, mais qu’elle est remplacée par un paramètre au niveau enfant.

    La compression serait activée au w3svc/filters/compression niveau. Toutefois, il se peut qu’il soit remplacé par un paramètre au niveau du site web ou de l’application.

    Par exemple, si vous avez HcDoDynamicCompression défini sur TRUE le w3svc/filters/compression niveau et que, pour le site web DoDynamicCompression FALSEpar défaut, la compression dynamique ne se produit pas pour les réponses aux demandes du site web par défaut.

  8. Vérifiez si un programme antivirus a analysé le répertoire dans lequel les fichiers compressés sont enregistrés.

    Lorsque la compression est activée sur un serveur exécutant IIS et qu’une requête HTTP est traitée à partir du répertoire de compression IIS, un fichier de 0 octets peut être retourné au lieu du fichier attendu.

    Note

    Vous pouvez uniquement voir ces symptômes si la compression statique HTTP est activée.

    Cela se produit parce qu’un logiciel antivirus s’exécutant sur le serveur IIS analyse le répertoire de compression IIS.

    Par conséquent, vous devez exclure le répertoire de compression IIS de la liste d’analyse du logiciel antivirus.

  9. Vérifiez si l’URL demandée contient une barre oblique dans le cadre des paramètres passés au fichier DLL en cours d’exécution.

  10. Vérifiez si les filtres ISAPI modifient les en-têtes de requête ou de réponse.

    Un ISAPI effectue l’opération d’envoi et n’envoie pas l’ensemble complet d’en-têtes HTTP avec l’entité à HTTP_COMPRESSION::DoDynamicCompression. Étant donné DoDynamicCompression que ne reçoit pas toutes les données de l’ISAPI, nous ne pouvons pas compresser la réponse. Des isAPis tiers et/ou non-Microsoft ont été vus pour ce faire en plaçant les en-têtes dans la fonction destinées au corps de l’entité ou au corps de l’entité dans la fonction destinée aux en-têtes HTTP, ou en ne fournissant aucun en-tête. Lorsque cela se produit, des éléments tels que le filtre ISAPI SF_NOTIFY_SEND_RESPONSE, ou AddResponseHeaders, ou la compression dynamique échouent. L’ISAPI doit placer les en-têtes et l’entité respectivement aux bons endroits.

  11. Vérifiez si le code d’état de la réponse est autre que 200. Dans IIS 6 ou 7, seules les réponses avec un état HTTP 200 sont compressées.

    La réponse avec des codes d’état autres que 200 ne sera pas compressée. Vous devez écrire un HTTPModule pour obtenir la même chose.

  12. Vérifiez si la requête contient un Via: header, ce Via headers qui indique que la requête est envoyée à IIS via un proxy.

    De nombreux proxys ne gèrent pas correctement l’en-tête de compression et fournissent des données compressées aux clients lorsqu’ils ne sont pas censés. Par conséquent, par défaut, les réponses compressées ne sont pas autorisées lorsque la demande a un en-tête Via. Vous pouvez le remplacer en définissant la HcNoCompressionForProxies clé de métabase sur True.

  13. Vérifiez si la requête concerne une page statique et que la réponse contient le pied de page du document. Les pieds de page de document entraînent l’échec de la compression statique.

  14. Vérifiez si la compression statique ne fonctionne pas. Cela peut se produire si un mappage d’application générique est installé au niveau racine dans IIS. Par exemple, nous avons des mappages d’applications pour les extensions de .html ou de .txt sur le serveur. Par exemple, IIS considère vos demandes pour .txt comme des requêtes dynamiques au lieu de requêtes statiques et, étant donné que .txt n’est pas une extension dans la liste de compression dynamique, elle n’est pas compressée.

  15. Vérifiez si la compression et Accept-Encoding: identity le champ IIS sont présents.

    Par RFC2616, si un Accept-Encoding champ est présent dans une demande et si le serveur ne peut pas envoyer de réponse, ce qui est acceptable en fonction de l’en-tête Accept-Encoding , le serveur doit envoyer une réponse d’erreur avec le code d’état 406 (non acceptable). Si aucun champ n’est Accept-Encoding présent dans une demande, le serveur peut supposer que le client acceptera tout codage de contenu. Dans ce cas, si « identity » est l’un des codes de contenu disponibles, le serveur doit utiliser le code de contenu « identity », sauf s’il contient des informations supplémentaires qu’un autre code de contenu est significatif pour le client.

  16. Vérifiez si vous utilisez la trace ETW pour résoudre le problème de compression IIS.

    Le suivi des événements pour Windows (ETW) est une fonctionnalité du système d’exploitation Windows qui vous permet de résoudre les problèmes liés aux requêtes HTTP.

    Voici les étapes à suivre pour résoudre le problème de compression IIS.

    1. Créez un fichier texte nommé IISProviders.txt et placez le contenu suivant dans le fichier. » IIS : WWW Server » est le nom du fournisseur, 0xFFFFFFFE signifie trace pour tous les événements, et 5 signifie niveau détaillé.

    2. Ouvrez une invite de commandes et exécutez la commande suivante.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Reproduisez le problème.

    4. Exécutez la commande suivante pour arrêter la trace.

       logman stop trace compressionTrace -ets
      
    5. Convertissez la trace en fichier texte.

      Le rapport de suivi convertit les données de trace binaires en texte et produit deux fichiers dans le répertoire où vous avez exécuté la tracerpt commande :

      tracerpt compressionTrace.etl
      
      • Summary.txt contient des détails généraux sur la session de trace, y compris les fournisseurs utilisés.

      • DumpFile.csv contient les données de trace réelles dans un format texte.

    6. Lisez le fichier de trace pour trouver des informations utiles. Ouvrez le dumpfile.csv et recherchez le mot clé tel que COMPRESSION_NOT_SUCCESS. Voici un exemple :

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    Cette erreur NO_MATCHING_SCHEME signifie qu’il n’y avait pas de correspondances de schéma de compression pour cette extension ou accept-encoding. Pour obtenir la liste détaillée des erreurs de compression, consultez la liste des erreurs de compression.

  17. Vérifiez si la trace FREB pour résoudre le problème de compression IIS est utilisée.

    Pour obtenir des instructions détaillées, consultez Résolution des problèmes liés aux demandes ayant échoué à l’aide du suivi dans IIS 7.

    Voici un exemple d’utilisation de la trace FREB IIS 7 pour résoudre les problèmes de compression.

    Capture d’écran du suivi des problèmes de compression à l’aide des messages d’erreur.

Liste des erreurs de compression

Pour obtenir la liste détaillée des erreurs de compression, consultez le tableau suivant.

Note

Les raisons suivantes s’appliquent à IIS 6 et IIS 7.

Motif Description
NO_ACCEPT_ENCODING Aucun encodage d’acceptation envoyé par le client.
COMPRESSION_DISABLED la compression est désactivée, car aucune configuration appropriée n’a été trouvée.
NO_COMPRESSION_10 Serveur non configuré pour compresser les requêtes 1.0.
NO_COMPRESSION_PROXY Serveur non configuré pour compresser les demandes proxy.
NO_MATCHING_SCHEME Aucun schéma de compression ne correspond à cette extension/Accept-Encoding.
UNKNOWN_ERROR Erreur inconnue.
NO_COMPRESSION_RANGE Serveur non configuré pour compresser les demandes de plage
FILE_TOO_SMALL Fichier inférieur au seuil de compression.
FILE_ENCRYPTED Fichier chiffré.
COMPRESS_FILE_NOT_FOUND La copie compressée n’existe pas.
COMPRESS_FILE_STALE Copie compressée obsolète.
NO_MATCHING_CONTENT_TYPE Serveur non configuré pour compresser le type de contenu pour cette extension.
HEADERS_SENT_TWICE En-têtes envoyés deux fois pour la même réponse.
NO_HEADER_SENT Aucun en-tête envoyé avant l’envoi du corps de l’entité.
NOT_SUCCESS_STATUS Le code d’état de la réponse n’est pas réussi (200).
ALREADY_CONTENT_ENCODING Un encodage de contenu est déjà présent dans la réponse.

Note

Les raisons suivantes s’appliquent uniquement à IIS 7.

Motif Description
FOOTER_ENABLED Pied de page de document activé pour les fichiers statiques.
NOT_FREQUENTLY_HIT L’URL n’a pas été demandée fréquemment pour justifier la compression.
FAIL_TO_COMPRESS Impossible de créer une copie compressée.

Plus d’informations