Risoluzione dei problemi di compressione IIS in IIS 6 o IIS 7.x
Si applica a: Internet Information Services 6.0, Internet Information Services 7.0 e versioni successive
Panoramica
L'abilitazione della compressione HTTP per le applicazioni Web IIS 6 o 7 è un modo per aumentare le prestazioni del sito.
Molte delle proprietà di compressione necessarie per gestire completamente IIS non sono esposte dall'interfaccia utente grafica dell'amministratore. Offre semplicemente un interruttore acceso o disattivato. Per abilitare completamente la compressione HTTP, è quindi necessario usare uno strumento diverso da Gestione IIS per aggiornare il file metabase.xml . Lo strumento più comune usato è adsutil.vbs, incluso nella directory di installazione di IIS.
Questo articolo illustra come configurare la compressione e identificare i motivi comuni per cui la compressione IIS potrebbe non funzionare in IIS 6 e IIS 7.x.
Strumenti usati in questo strumento di risoluzione dei problemi
- Fiddler
- Process Monitor
- Metabase ACL
- Traccia FREB di IIS 7
Verifica
Determinare se la compressione funziona
L'unico modo per determinare se il server IIS ha inviato una risposta compressa consiste nell'analizzare una traccia di rete della richiesta client e della risposta del server. La richiesta dal client deve contenere l'intestazione di richiesta HTTP seguente:
HTTP: Accept-Encoding =gzip, deflate
In questo modo il server sa che il client è disposto a ricevere una risposta compressa e supporta la compressione. In cambio, una risposta compressa dal server conterrà l'intestazione di risposta HTTP seguente e un valore:
HTTP: Content-Encoding = gzip
Gli screenshot seguenti mostrano l'output dello strumento Fiddler quando la compressione non funziona:
Risoluzione dei problemi di compressione
Per risolvere i problemi di compressione, seguire questa procedura:
Abilitare la compressione in IIS 6 o IIS 7.
Da Gestione IIS fare clic con il pulsante destro del mouse sul nodo Siti Web, scegliere Proprietà e quindi selezionare Servizi.
Specificare la cartella di compressione e le autorizzazioni.
IIS archivia i file compressi in una cartella, che può essere configurata. Per impostazione predefinita, è
%windir%\IIS Temporary Compressed Files
per IIS 6 e%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
per IIS 7.IIS_WPG(IIS_IURS per IIS 7) deve disporre dell'autorizzazione di controllo completo per questa cartella. Usare Monitoraggio processi per risolvere questo tipo di problema di autorizzazione.
Controllare se la compressione è abilitata in Metabase.xml.
La compressione non è attivata nella metabase nei nodi destro. Per la configurazione di compressione sono disponibili tre nodi metabase:
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
La configurazione del
/parameters
nodo è obbligatoria. È quindi possibile configurare uno o/deflate
un/gzip
nodo o entrambi. Ciò significa che la configurazione solo dei nodi gzip, deflate o parametri non funzionerà. Se si configurano i/parameters
nodi e/gzip
, lo schema di compressione Gzip verrà abilitato. Se si configurano i/parameters
nodi e/deflate
, verrà abilitato lo schema di compressione Deflate. Infine, se si configurano tutti e tre i nodi, verrà abilitata sia la compressione GZip che la compressione Deflate.Controllare l'autorizzazione della metabase per IIS 6.
Per impostazione predefinita,
IIS_WPG
dispone delle autorizzazioni Lettura, Lettura non protetta, Enumerazione chiavi e Scrittura per ./LM/W3SVC/Filters
IIS non sarà in grado di inizializzare la compressione se le autorizzazioni sono state rimosse a causa di modifiche impreviste o se la protezione avanzata è avanzata.
Usare metaacl.vbs per verificare e modificare l'ACL di metabase IIS 6. Per altre informazioni, vedere ACL metabase predefinito.
Se l'identità del pool di applicazioni (o il
IIS_WPG
gruppo in generale) non ha accesso in lettura e scrittura alla chiave di metabase W3SVC o Filtri, una condizione di errore diCOMPRESSION_DISABLED
verrà registrata in una traccia Enterprise Tracing for Windows (ETW).Traccia ETW
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
Controllare se la compressione dinamica o statica è disattivata in Metabase.xml.
In ognuno dei tre nodi di configurazione (
/parameters
,/gzip
e/deflate
) è possibile abilitare la compressione statica e/o dinamica. Per abilitare la compressione statica per i tipi di file, ad esempio .txt e .html, è necessario impostare laHcDoStaticCompression
chiave su1
(oTRUE
). Per abilitare la compressione dinamica per i tipi di file, ad esempio .asp, .aspx, asmx o .exe, è necessario impostare laHcDoDynamicCompression
chiave su1
(oTRUE
).Ad esempio, per impostare la compressione dinamica nel
/parameters
nodo, eseguire il comando seguente usando adsutil.vbs:cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
L'output del comando precedente è simile al seguente:
HcDoDynamicCompression : (BOOLEAN) True
In IIS7
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
Controllare se il tipo di file da comprimere è elencato nelle sezioni estensioni di file appropriate nei
/gzip
nodi e/deflate
.Dopo aver attivato la compressione con le
HcDoDynamicCompression
chiavi e/oHcDoStaticCompression
, specificare quali tipi di file devono essere effettivamente compressi. Per impostazione predefinita, la compressione STATIC usa tipi di file come .htm, .html e .txt e la compressione DINAMICA usano .asp, .dll e .exe. Se si desidera comprimere tipi di file diversi, ad esempio .aspx, aggiungerlo alla sezione dell'estensione di file appropriata nei/gzip
nodi e-o/deflate
, a seconda del tipo di compressione in uso. Per la compressione dei file statici ,ad esempio .html, txt e xml, aggiungere le estensioni di file allaHcFileExtensions
proprietà . Per la compressione dinamica , ad esempio .asp, .aspx e asmx, aggiungerla allaHcScriptFileExtension
proprietà .Per i file statici
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
Il comando precedente mostra l'output seguente:
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
Per i file dinamici
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
Il comando precedente mostra l'output seguente:
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>
Note
È necessario configurare le
HcFileExtensions
proprietà oHcScriptFileExtensions
con la sintassi corretta. Eventuali spazi finali o virgolette o ritorni a capo non necessari causeranno la configurazione errata della proprietà. Sfortunatamente, adsutil.vbs non mostra un errore se aggiungi uno spazio aggiuntivo, quindi devi fare molta attenzione. Inoltre, non è possibile copiare o incollare i valori in un prompt dei comandi o nel file di metabase.xml (modifica diretta metabase) e deve digitarlo manualmente.Controllare se la compressione è impostata a livello master, ma viene sottoposta a override da un'impostazione a livello figlio.
La compressione verrà abilitata a
w3svc/filters/compression
livello di . Tuttavia, potrebbe essere che venga sottoposto a override da un'impostazione a livello di sito Web o applicazione.Ad esempio, se è stato
HcDoDynamicCompression
impostato suTRUE
a livellow3svc/filters/compression
e per il sito Web predefinito èDoDynamicCompression
impostata suFALSE
, la compressione dinamica non si verificherà per le risposte alle richieste per il sito Web predefinito.Controllare se un programma antivirus ha analizzato la directory in cui vengono salvati i file compressi.
Quando la compressione è abilitata in un server che esegue IIS e viene fornita una richiesta HTTP dalla directory di compressione IIS, potrebbe essere restituito un file a 0 byte anziché il file previsto.
Note
Questi sintomi possono essere visualizzati solo se è abilitata la compressione statica HTTP.
Ciò si verifica perché un software antivirus in esecuzione nel server IIS esegue l'analisi della directory di compressione IIS.
È quindi necessario escludere la directory di compressione IIS dall'elenco di analisi del software antivirus.
Controllare se l'URL richiesto contiene una barra come parte dei parametri passati al file DLL in esecuzione.
Controllare se i filtri ISAPI modificano le intestazioni di richiesta o risposta.
Un ISAPI esegue l'operazione di invio e non invia il set completo di intestazioni HTTP insieme all'entità a
HTTP_COMPRESSION::DoDynamicCompression
. PoichéDoDynamicCompression
non riceve tutti i dati dall'ISAPI, non è possibile comprimere la risposta. Terze parti e/o non Microsoft ISAPI sono state viste a questo scopo inserendo le intestazioni nella funzione destinata al corpo dell'entità o al corpo dell'entità nella funzione destinata alle intestazioni HTTP o non fornendo intestazioni. In questo caso, operazioni come il filtro ISAPI SF_NOTIFY_SEND_RESPONSE o AddResponseHeaders o la compressione dinamica avrà esito negativo. L'ISAPI deve inserire rispettivamente le intestazioni e l'entità nelle posizioni corrette.Controllare se il codice di stato della risposta è diverso da 200. In IIS 6 o 7, verranno compresse solo le risposte con stato HTTP 200.
La risposta con codici di stato diversi da 200 non verrà compressa. È necessario scrivere un oggetto
HTTPModule
per ottenere lo stesso risultato.Controllare se la richiesta contiene un
Via: header
oggetto , indicaVia headers
che la richiesta viene inviata a IIS tramite un proxy.Molti proxy non gestiscono correttamente l'intestazione di compressione e forniscono dati compressi ai client quando non devono farlo. Pertanto, per impostazione predefinita, le risposte compresse non sono consentite quando la richiesta ha un'intestazione Via. È possibile eseguire l'override di questa impostazione impostando la chiave metabase
HcNoCompressionForProxies
suTrue
.Controllare se la richiesta è relativa a una pagina statica e la risposta contiene il piè di pagina del documento. I piè di pagina del documento causeranno un errore di compressione statica.
Controllare se la compressione statica non funziona. Questo problema può verificarsi se è installato un mapping di applicazioni con caratteri jolly a livello radice in IIS. Ad esempio, sono disponibili mapping delle applicazioni per le estensioni .html o .txt nel server e in questo modo IIS considererà le richieste di .txt come richieste dinamiche anziché statiche e poiché .txt non è un'estensione nell'elenco di compressione dinamica, non viene compressa.
Controllare se è presente il campo Compressione e
Accept-Encoding: identity
compressione IIS.Per RFC2616, se un
Accept-Encoding
campo è presente in una richiesta e se il server non può inviare una risposta, che è accettabile in base all'intestazioneAccept-Encoding
, il server deve inviare una risposta di errore con il codice di stato 406 (Non accettabile). Se non è presente alcunAccept-Encoding
campo in una richiesta, il server potrebbe presupporre che il client accetti qualsiasi codifica del contenuto. In questo caso, se "identity" è uno dei codici di contenuto disponibili, il server deve usare il codice del contenuto "identity", a meno che non disponga di informazioni aggiuntive significative per il client.Controllare se si usa la traccia ETW per risolvere il problema di compressione IIS.
Event Tracing for Windows (ETW) è una funzionalità del sistema operativo Windows che consente di risolvere i problemi relativi alle richieste HTTP.
Ecco i passaggi per risolvere il problema di compressione IIS.
Creare un file di testo denominato IISProviders.txt e inserire il contenuto nel file." IIS: WWW Server" è il nome del provider, 0xFFFFFFFE significa traccia per tutti gli eventi e 5 indica il livello dettagliato.
Aprire un prompt dei comandi ed eseguire il comando seguente.
logman start trace compressionTrace -pf IISProviders.txt -ets
Riprodurre il problema.
Eseguire il comando seguente per arrestare la traccia.
logman stop trace compressionTrace -ets
Convertire la traccia in un file di testo.
Il report di traccia converte i dati di traccia binaria in testo e produce due file nella directory in cui è stato eseguito il
tracerpt
comando:tracerpt compressionTrace.etl
Summary.txt contiene informazioni generali sulla sessione di traccia, inclusi i provider usati.
DumpFile.csv contiene i dati di traccia effettivi in un formato di testo.
Leggere il file di traccia per trovare informazioni utili. Aprire il dumpfile.csv e trovare la parola chiave come COMPRESSION_NOT_SUCCESS. Ecco un esempio:
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
Questo errore NO_MATCHING_SCHEME indica che non sono state rilevate corrispondenze dello schema di compressione per questa estensione o Accept-Encoding. Per un elenco dettagliato degli errori di compressione, vedere l'elenco degli errori di compressione.
Controllare se viene usata la traccia FREB per la risoluzione dei problemi di compressione IIS.
Per informazioni dettagliate, vedere Risoluzione dei problemi relativi alle richieste non riuscite tramite traccia in IIS 7.
Ecco un esempio dell'uso della traccia FREB di IIS 7 per risolvere i problemi di compressione.
Elenco degli errori di compressione
Per un elenco dettagliato degli errori di compressione, vedere la tabella seguente.
Note
I motivi seguenti si applicano sia a IIS 6 che a IIS 7.
Motivo | Descrizione |
---|---|
NO_ACCEPT_ENCODING | Nessuna codifica accept inviata dal client. |
COMPRESSION_DISABLED | la compressione è disabilitata perché non è stata trovata alcuna configurazione appropriata. |
NO_COMPRESSION_10 | Server non configurato per comprimere le richieste 1.0. |
NO_COMPRESSION_PROXY | Server non configurato per comprimere le richieste proxy. |
NO_MATCHING_SCHEME | Nessuna corrispondenza dello schema di compressione per questa estensione/Accept-Encoding. |
UNKNOWN_ERROR | Errore sconosciuto. |
NO_COMPRESSION_RANGE | Server non configurato per comprimere le richieste di intervallo |
FILE_TOO_SMALL | File inferiore alla soglia di compressione. |
FILE_ENCRYPTED | File crittografato. |
COMPRESS_FILE_NOT_FOUND | La copia compressa non esiste. |
COMPRESS_FILE_STALE | Copia compressa non aggiornata. |
NO_MATCHING_CONTENT_TYPE | Server non configurato per comprimere content-Type per questa estensione. |
HEADERS_SENT_TWICE | Intestazioni inviate due volte per la stessa risposta. |
NO_HEADER_SENT | Nessuna intestazione inviata prima dell'invio del corpo dell'entità. |
NOT_SUCCESS_STATUS | Il codice di stato della risposta non riesce (200). |
ALREADY_CONTENT_ENCODING | Nella risposta è già presente una codifica del contenuto. |
Note
I motivi seguenti si applicano solo a IIS 7.
Motivo | Descrizione |
---|---|
FOOTER_ENABLED | Piè di pagina del documento abilitato per i file statici. |
NOT_FREQUENTLY_HIT | L'URL non è stato richiesto abbastanza frequentemente per giustificare la compressione. |
FAIL_TO_COMPRESS | Impossibile creare la copia compressa. |