Behandeln von IIS-Komprimierungsproblemen in IIS 6 oder IIS 7.x
Gilt für: Internetinformationsdienste 6.0, Internetinformationsdienste 7.0 und höhere Versionen
Übersicht
Das Aktivieren der HTTP-Komprimierung für Ihre IIS 6- oder 7-Webanwendungen ist eine Möglichkeit, die Websiteleistung zu erhöhen.
Viele der zum vollständigen Verwalten von IIS erforderlichen Komprimierungseigenschaften werden von der Administrator-GUI nicht verfügbar gemacht. Es bietet lediglich einen Ein- oder Ausschalter. Um die HTTP-Komprimierung vollständig zu aktivieren, müssen Sie also ein anderes Tool als den IIS-Manager verwenden, um die metabase.xml Datei zu aktualisieren. Das am häufigsten verwendete Tool ist adsutil.vbs, das im IIS-Installationsverzeichnis enthalten ist.
Dieser Artikel hilft Ihnen beim Konfigurieren der Komprimierung und identifiziert häufige Gründe für die IIS-Komprimierung möglicherweise nicht in IIS 6 und IIS 7.x.
In dieser Problembehandlung verwendete Tools
- Fiddler
- Prozessmonitor
- Metabase ACL
- IIS 7 FREB-Ablaufverfolgung
Überprüfung
Ermitteln, ob die Komprimierung funktioniert
Die einzige Möglichkeit, zu bestimmen, ob der IIS-Server eine komprimierte Antwort gesendet hat, besteht darin, eine Netzwerkablaufverfolgung der Clientanforderung und Serverantwort zu analysieren. Die Anforderung vom Client muss den folgenden HTTP-Anforderungsheader enthalten:
HTTP: Accept-Encoding =gzip, deflate
Dadurch wird dem Server mitgeteilt, dass der Client bereit ist, eine komprimierte Antwort zu erhalten und die Komprimierung zu unterstützen. Im Gegenzug enthält eine komprimierte Antwort des Servers den folgenden HTTP Response-Header und einen Wert:
HTTP: Content-Encoding = gzip
Die folgenden Screenshots zeigen die Ausgabe des Fiddler-Tools, wenn die Komprimierung nicht funktioniert:
Behandeln von Komprimierungsproblemen
Führen Sie die folgenden Schritte aus, um Komprimierungsprobleme zu beheben:
Aktivieren der Komprimierung in IIS 6 oder IIS 7.
Klicken Sie im IIS-Manager mit der rechten Maustaste auf den Knoten "Websites", wählen Sie "Eigenschaften" und dann "Dienste" aus.
Geben Sie komprimierungsordner und -berechtigungen an.
IIS speichert komprimierte Dateien in einem Ordner, der konfiguriert werden kann. Standardmäßig ist
%windir%\IIS Temporary Compressed Files
es für IIS 6 und%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
für IIS 7 vorgesehen.IIS_WPG (IIS_IURS für IIS 7) muss die volle Kontrollberechtigung für diesen Ordner haben. Verwenden Sie "Prozessüberwachung" , um diese Art eines Berechtigungsproblems zu beheben.
Überprüfen Sie, ob die Komprimierung in Metabase.xml aktiviert ist.
Die Komprimierung ist in der Metabasis auf den rechten Knoten nicht aktiviert. Es gibt drei Metabasisknoten für die Komprimierungskonfiguration:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
Das Konfigurieren des
/parameters
Knotens ist obligatorisch. Anschließend können Sie entweder/gzip
oder Knoten oder/deflate
beides konfigurieren. Dies bedeutet, dass das Konfigurieren nur der Gzip-, Deflate- oder Parameterknoten nicht funktioniert. Wenn Sie die Komprimierungsschema und/gzip
die/parameters
Knoten konfigurieren, wird das Gzip-Komprimierungsschema aktiviert. Wenn Sie die/parameters
Und-Knoten/deflate
konfigurieren, wird das Deflate-Komprimierungsschema aktiviert. Wenn Sie schließlich alle drei Knoten konfigurieren, wird sowohl die GZip-Komprimierung als auch die Deflate-Komprimierung aktiviert.Überprüfen Sie die Metabasisberechtigung für IIS 6.
Standardmäßig
IIS_WPG
verfügt über Lese-, Unsecure Read-, Enumerate Keys- und Write-Berechtigungen für die/LM/W3SVC/Filters
.IIS kann die Komprimierung nicht initialisieren, wenn die Berechtigungen aufgrund unerwarteter Änderungen entfernt wurden oder wenn die Sicherheit härter wird.
Verwenden Sie metaacl.vbs zum Überprüfen und Ändern der IIS 6-Metabasis-ACL. Weitere Informationen finden Sie unter Standardmetabasis-ACL.
Wenn die Anwendungspoolidentität (oder die
IIS_WPG
Gruppe im Allgemeinen) keinen Lese- und Schreibzugriff auf den Metabasisschlüssel W3SVC oder Filter hat, wird eine FehlerbedingungCOMPRESSION_DISABLED
in einer ETW-Ablaufverfolgung (Enterprise Tracing for Windows) protokolliert.ETW-Ablaufverfolgung
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
Überprüfen Sie, ob die dynamische oder statische Komprimierung in Metabase.xml deaktiviert ist.
Bei jedem der drei Konfigurationsknoten (
/parameters
und/deflate
) haben Sie die Möglichkeit,/gzip
statische und/oder dynamische Komprimierung zu aktivieren. Um die statische Komprimierung für Dateitypen wie .txt und .html zu aktivieren, müssen Sie denHcDoStaticCompression
Schlüssel auf1
(oderTRUE
) festlegen. Um die dynamische Komprimierung für Dateitypen wie .asp, .aspx, ASMX oder .exe zu aktivieren, müssen Sie denHcDoDynamicCompression
Schlüssel auf1
(oderTRUE
) festlegen.Um beispielsweise die dynamische Komprimierung am
/parameters
Knoten festzulegen, führen Sie den folgenden Befehl mithilfe von adsutil.vbs aus:cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
Die Ausgabe des vorherigen Befehls sieht wie folgt aus:
HcDoDynamicCompression : (BOOLEAN) True
In IIS7
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
Überprüfen Sie, ob der dateityp, den Sie komprimieren möchten, in den entsprechenden Abschnitten der Dateierweiterungen auf den
/gzip
Und/deflate
Knoten aufgeführt ist.Nachdem Sie die Komprimierung mit den
HcDoDynamicCompression
Und/oderHcDoStaticCompression
Schlüsseln aktiviert haben, geben Sie an, welche Dateitypen tatsächlich komprimiert werden müssen. Die STATISCHE Komprimierung verwendet standardmäßig Dateitypen wie .htm, .html und .txt und DYNAMISCHE Komprimierung .asp, .dll und .exe. Wenn Sie unterschiedliche Dateitypen komprimieren möchten, z. B. .aspx, fügen Sie sie abhängig vom verwendeten Komprimierungstyp dem entsprechenden Abschnitt der Dateierweiterung in den/gzip
Und-oder-Knoten/deflate
hinzu. Fügen Sie bei der statischen Dateikomprimierung (z. B. .html, txt und xml) die Dateierweiterungen zurHcFileExtensions
Eigenschaft hinzu. Fügen Sie sie für die dynamische Komprimierung (z. B. .asp, .aspx und ASMX) derHcScriptFileExtension
Eigenschaft hinzu.Für statische Dateien
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
Der vorherige Befehl zeigt die folgende Ausgabe:
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
Für dynamische Dateien
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
Der vorherige Befehl zeigt die folgende Ausgabe:
HcFileExtensions : (LIST) (4 Items) "asp" "dll" "exe" "aspx"
In 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>
Notiz
Sie müssen die
HcFileExtensions
Eigenschaften mitHcScriptFileExtensions
der richtigen Syntax konfigurieren. Nachfolgende Leerzeichen oder unnötige Anführungszeichen oder Wagenrückgänge führen dazu, dass die Eigenschaft falsch konfiguriert ist. Leider zeigt adsutil.vbs keinen Fehler an, wenn Sie einen zusätzlichen Platz hinzufügen, daher müssen Sie sehr vorsichtig sein. Außerdem können Sie die Werte nicht in eine Eingabeaufforderung oder in die metabase.xml-Datei (metabase direct-edit) kopieren oder einfügen und müssen sie manuell eingeben.Überprüfen Sie, ob die Komprimierung auf master-Ebene festgelegt ist, aber durch eine Einstellung auf einer untergeordneten Ebene außer Kraft gesetzt wird.
Komprimierung wäre auf der
w3svc/filters/compression
Ebene aktiviert. Es kann jedoch sein, dass eine Einstellung auf Website- oder Anwendungsebene überschrieben wird.Wenn Sie z. B. auf die
w3svc/filters/compression
Ebene festgelegtTRUE
habenHcDoDynamicCompression
und für die Standardwebsite auf "Dynamische Komprimierung" festgelegtFALSE
istDoDynamicCompression
, tritt keine dynamische Komprimierung für Antworten auf Anforderungen für die Standardwebsite auf.Überprüfen Sie, ob ein Antivirenprogramm das Verzeichnis gescannt hat, in dem die komprimierten Dateien gespeichert werden.
Wenn die Komprimierung auf einem Server mit IIS aktiviert ist und eine HTTP-Anforderung aus dem IIS-Komprimierungsverzeichnis bereitgestellt wird, wird möglicherweise eine 0-Byte-Datei anstelle der erwarteten Datei zurückgegeben.
Notiz
Diese Symptome können möglicherweise nur auftreten, wenn die statische HTTP-Komprimierung aktiviert ist.
Dies geschieht, da eine Antivirensoftware, die auf dem IIS-Server ausgeführt wird, das IIS-Komprimierungsverzeichnis scannt.
Daher müssen Sie das IIS-Komprimierungsverzeichnis aus der Scanliste der Antivirensoftware ausschließen.
Überprüfen Sie, ob die angeforderte URL als Teil der an die ausführende DLL-Datei übergebenen Parameter einen Schrägstrich enthält.
Überprüfen Sie, ob die ISAPI-Filter die Anforderungs- oder Antwortheader ändern.
Eine ISAPI ausführt den Sendevorgang und sendet nicht den vollständigen Satz von HTTP-Headern zusammen mit der Entität an
HTTP_COMPRESSION::DoDynamicCompression
. DaDoDynamicCompression
nicht alle Daten aus der ISAPI empfangen werden, können wir die Antwort nicht komprimieren. Dies wurde von Drittanbietern und/oder nicht von Microsoft stammenden ISAPIs gesehen, indem die Kopfzeilen in die Funktion eingefügt werden, die für den Entitätstext oder den Entitätstext in der Funktion vorgesehen ist, die für die HTTP-Header vorgesehen ist oder keine Header bereitgestellt werden. Wenn dies geschieht, schlagen Dinge wie der ISAPI-Filter SF_NOTIFY_SEND_RESPONSE oder AddResponseHeaders oder die dynamische Komprimierung fehl. Die ISAPI muss die Header und die Entität an den richtigen Stellen platzieren.Überprüfen Sie, ob der Antwortstatuscode etwas anderes als 200 ist. In IIS 6 oder 7 werden nur Antworten mit einem HTTP 200-Status komprimiert.
Die Antwort mit anderen Statuscodes als 200 wird nicht komprimiert. Sie müssen einen
HTTPModule
schreiben, um dasselbe zu erreichen.Überprüfen Sie, ob die Anforderung einen
Via: header
enthält, derVia headers
angibt, dass die Anforderung über einen Proxy an IIS weitergeleitet wird.Viele Proxys behandeln den Komprimierungsheader nicht ordnungsgemäß und stellen komprimierte Daten für Clients bereit, wenn sie nicht vorgesehen sind. Standardmäßig sind die komprimierten Antworten also nicht zulässig, wenn die Anforderung über einen Via-Header verfügt. Sie können dies überschreiben, indem Sie den
HcNoCompressionForProxies
Metabasisschlüssel aufTrue
.Überprüfen Sie, ob die Anforderung für eine statische Seite ist, und die Antwort enthält Dokumentfußzeile. Dokumentfußzeilen führen dazu, dass die statische Komprimierung fehlschlägt.
Überprüfen Sie, ob die statische Komprimierung nicht funktioniert. Dies kann passieren, wenn eine Zuordnung von Wildcardanwendungen auf der Stammebene in IIS installiert ist. Beispielsweise verfügen wir über Anwendungszuordnungen für die .html- oder .txt Erweiterungen auf dem Server. Dadurch wird IIS ihre Anforderungen an .txt als dynamische Anforderungen anstelle von statischen Anforderungen in Betracht ziehen, und da .txt keine Erweiterung in der Liste der dynamischen Komprimierung ist, wird sie nicht komprimiert.
Überprüfen Sie, ob die IIS-Komprimierung und
Accept-Encoding: identity
das Feld vorhanden sind.Pro RFC2616, wenn ein
Accept-Encoding
Feld in einer Anforderung vorhanden ist und der Server keine Antwort senden kann, die gemäß demAccept-Encoding
Header akzeptabel ist, sollte der Server eine Fehlerantwort mit dem Statuscode 406 (Nicht akzeptabel) senden. Wenn keinAccept-Encoding
Feld in einer Anforderung vorhanden ist, geht der Server möglicherweise davon aus, dass der Client eine Inhaltscodierung akzeptiert. Wenn "Identity" einer der verfügbaren Inhaltscodes ist, sollte der Server den Inhaltscode "Identität" verwenden, es sei denn, er enthält zusätzliche Informationen, dass ein anderer Inhaltscode für den Client aussagekräftig ist.Überprüfen Sie, ob Sie die ETW-Ablaufverfolgung zum Beheben des IIS-Komprimierungsproblems verwenden.
Die Ereignisablaufverfolgung für Windows (ETW) ist ein Feature des Windows-Betriebssystems, mit dem Sie Probleme mit HTTP-Anforderungen beheben können.
Hier sind die Schritte zur Problembehandlung des IIS-Komprimierungsproblems.
Erstellen Sie eine Textdatei mit dem Namen IISProviders.txt , und fügen Sie den Inhalt in die Datei ein." IIS: WWW Server" ist der Anbietername, 0xFFFFFFFE bedeutet Ablaufverfolgung für alle Ereignisse, und 5 bedeutet ausführliche Ebene.
Öffnen Sie eine Eingabeaufforderung, und führen Sie den folgenden Befehl aus.
logman start trace compressionTrace -pf IISProviders.txt -ets
Reproduzieren Sie das Problem.
Führen Sie den folgenden Befehl aus, um die Ablaufverfolgung zu beenden.
logman stop trace compressionTrace -ets
Konvertieren Sie die Ablaufverfolgung in eine Textdatei.
Der Ablaufverfolgungsbericht konvertiert die binären Ablaufverfolgungsdaten in Text und erzeugt zwei Dateien im Verzeichnis, in dem Sie den
tracerpt
Befehl ausgeführt haben:tracerpt compressionTrace.etl
Summary.txt enthält allgemeine Details zur Ablaufverfolgungssitzung, einschließlich der verwendeten Anbieter.
DumpFile.csv enthält die tatsächlichen Ablaufverfolgungsdaten in einem Textformat.
Lesen Sie die Ablaufverfolgungsdatei, um nützliche Informationen zu finden. Öffnen Sie die dumpfile.csv, und suchen Sie nach einem Schlüsselwort wie COMPRESSION_NOT_SUCCESS. Ein Beispiel:
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
Dieser Fehler NO_MATCHING_SCHEME bedeutet, dass für diese Erweiterung oder accept-Encoding keine Komprimierungsschema-Übereinstimmungen vorhanden sind. Eine detaillierte Liste der Komprimierungsfehler finden Sie in der Liste der Komprimierungsfehler.
Überprüfen Sie, ob die FREB-Ablaufverfolgung zur Problembehandlung des IIS-Komprimierungsproblems verwendet wird.
Ausführliche Schritte finden Sie unter Problembehandlung bei fehlgeschlagenen Anforderungen mithilfe der Ablaufverfolgung in IIS 7.
Hier ist ein Beispiel für die Verwendung der IIS 7 FREB-Ablaufverfolgung zur Behandlung von Komprimierungsproblemen.
Liste der Komprimierungsfehler
Eine detaillierte Liste der Komprimierungsfehler finden Sie in der folgenden Tabelle.
Notiz
Die folgenden Gründe gelten sowohl für IIS 6 als auch für IIS 7.
Ursache | Beschreibung |
---|---|
NO_ACCEPT_ENCODING | Keine Vom Client gesendete Accept-Encoding. |
COMPRESSION_DISABLED | Die Komprimierung ist deaktiviert, da keine geeignete Konfiguration gefunden wurde. |
NO_COMPRESSION_10 | Der Server ist nicht für die Komprimierung von 1.0-Anforderungen konfiguriert. |
NO_COMPRESSION_PROXY | Der Server ist nicht für die Komprimierung von Proxyanforderungen konfiguriert. |
NO_MATCHING_SCHEME | Für diese Erweiterung/Accept-Codierung stimmen keine Komprimierungsschemas überein. |
UNKNOWN_ERROR | Unbekannter Fehler. |
NO_COMPRESSION_RANGE | Server nicht für die Komprimierung von Bereichsanforderungen konfiguriert |
FILE_TOO_SMALL | Datei kleiner als Komprimierungsschwellenwert. |
FILE_ENCRYPTED | Datei verschlüsselt. |
COMPRESS_FILE_NOT_FOUND | Komprimierte Kopie ist nicht vorhanden. |
COMPRESS_FILE_STALE | Komprimierte Kopie veraltet. |
NO_MATCHING_CONTENT_TYPE | Der Server ist nicht für die Komprimierung des Inhaltstyps für diese Erweiterung konfiguriert. |
HEADERS_SENT_TWICE | Kopfzeilen, die zweimal für dieselbe Antwort gesendet werden. |
NO_HEADER_SENT | Vor dem Senden des Entitätstexts wurden keine Header gesendet. |
NOT_SUCCESS_STATUS | Der Antwortstatuscode ist nicht erfolgreich (200). |
ALREADY_CONTENT_ENCODING | In der Antwort ist bereits eine Inhaltscodierung vorhanden. |
Notiz
Die folgenden Gründe gelten nur für IIS 7.
Ursache | Beschreibung |
---|---|
FOOTER_ENABLED | Dokumentfuß für statische Dateien aktiviert. |
NOT_FREQUENTLY_HIT | DIE URL wurde nicht häufig genug angefordert, um die Komprimierung zu rechtfertigen. |
FAIL_TO_COMPRESS | Komprimierte Kopie konnte nicht erstellt werden. |