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 :
Résolution des problèmes de compression
Procédez comme suit pour résoudre les problèmes de compression :
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.
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.
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.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 estCOMPRESSION_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
Vérifiez si la compression dynamique ou statique est désactivée dans Metabase.xml.
À chacun des trois nœuds de configuration (
/parameters
,/gzip
et/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 laHcDoStaticCompression
clé1
sur (ouTRUE
). Pour activer la compression dynamique pour les types de fichiers tels que .asp, .aspx, .asmx ou .exe, vous devez définir laHcDoDynamicCompression
clé1
sur (ouTRUE
).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>
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
lesHcDoDynamicCompression
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 à laHcFileExtensions
propriété. Pour la compression dynamique (par exemple, .asp, .aspx et .asmx) ajoutez-la à laHcScriptFileExtension
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
lesHcFileExtensions
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.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 surTRUE
lew3svc/filters/compression
niveau et que, pour le site webDoDynamicCompression
FALSE
par défaut, la compression dynamique ne se produit pas pour les réponses aux demandes du site web par défaut.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.
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.
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.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.Vérifiez si la requête contient un
Via: header
, ceVia 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 surTrue
.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.
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.
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êteAccept-Encoding
, le serveur doit envoyer une réponse d’erreur avec le code d’état 406 (non acceptable). Si aucun champ n’estAccept-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.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.
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é.
Ouvrez une invite de commandes et exécutez la commande suivante.
logman start trace compressionTrace -pf IISProviders.txt -ets
Reproduisez le problème.
Exécutez la commande suivante pour arrêter la trace.
logman stop trace compressionTrace -ets
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.
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.
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.
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. |