Share via


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 di accensione o spegnimento. 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 consente di configurare la compressione e identifica 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
  • Elenco di controllo di accesso della metabase
  • 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 della richiesta HTTP seguente:

HTTP: Accept-Encoding =gzip, deflate

Ciò consente al server di sapere che il client è disposto a ricevere una risposta compressa e supporta la compressione. In cambio, una risposta compressa dal server conterrà l'intestazione della risposta HTTP seguente e un valore:

HTTP: Content-Encoding = gzip

Gli screenshot seguenti mostrano l'output dello strumento Fiddler quando la compressione non funziona:

Screenshot di Compressione HTTP impostata su Nessuna compressione nella scheda Trasformatore.

Screenshot di una sezione Compressione HTTP disabilitata nella scheda Trasformatore.

Risoluzione dei problemi di compressione

Per risolvere i problemi di compressione, seguire questa procedura:

  1. Abilitare la compressione in IIS 6 o IIS 7.

    In Gestione IIS fare clic con il pulsante destro del mouse sul nodo Siti Web , selezionare Proprietà e quindi selezionare Servizi.

    Screenshot della compressione HTTP con l'opzione Comprimi file statici selezionata e le dimensioni massime della directory temporanea impostate su unlimited.

    Screenshot delle opzioni di compressione abilitate con i valori predefiniti.

  2. 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.

  3. Verificare se la compressione è abilitata in Metabase.xml.

    La compressione non è attivata nella metabase nei nodi giusti. Per la configurazione della compressione sono presenti tre nodi della metabase:

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

    La configurazione del /parameters nodo è obbligatoria. È quindi possibile configurare uno /gzip o un /deflate nodo o entrambi. Ciò significa che la configurazione solo dei nodi gzip, deflate o parameters non funzionerà. Se si configurano i /parameters nodi e /gzip , verrà abilitato lo schema di compressione Gzip. Se si configurano i /parameters nodi e /deflate , verrà abilitato lo schema di compressione Deflate. Infine, se si configurano tutti e tre i nodi, verranno abilitati sia la compressione GZip che la compressione deflate.

  4. Controllare l'autorizzazione della metabase per IIS 6.

    Per impostazione predefinita, IIS_WPG dispone delle autorizzazioni Lettura, Lettura non sicura, 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 viene avanzata.

    Usare metaacl.vbs per verificare e modificare l'ACL della metabase iis 6. Per altre informazioni, vedere ACL della metabase predefinito.

    Se l'identità del pool di applicazioni (o il IIS_WPG gruppo in generale) non dispone dell'accesso in lettura e scrittura alla chiave della metabase W3SVC o Filters, una condizione di errore di COMPRESSION_DISABLED verrà registrata in una traccia ETW (Enterprise Tracing for Windows).

    Traccia ETW

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Controllare se la compressione dinamica o statica è disattivata in Metabase.xml.

    In ognuno dei tre nodi di configurazione (/parameters, /gzipe /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 la HcDoStaticCompression chiave su 1 (o TRUE). Per abilitare la compressione dinamica per i tipi di file, ad esempio .asp, .aspx, asmx o .exe, è necessario impostare la HcDoDynamicCompression chiave su 1 (o TRUE).

    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>
    
  6. Controllare se il tipo di file da comprimere è elencato nelle sezioni appropriate delle estensioni di file nei /gzip nodi e /deflate .

    Dopo aver attivato la compressione con le HcDoDynamicCompression chiavi e/o HcDoStaticCompression , 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 DYNAMIC usa .asp, .dll e .exe. Se si desidera comprimere tipi di file diversi, ad esempio .aspx, aggiungerlo alla sezione di estensione del file appropriata nei /gzip nodi e-o /deflate , a seconda del tipo di compressione in uso. Per la compressione di file statici,ad esempio .html, txt e xml, aggiungere le estensioni di file alla HcFileExtensions proprietà . Per la compressione dinamica,ad esempio .asp, .aspx e asmx, aggiungerla alla HcScriptFileExtension 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>
    

    Nota

    È necessario configurare le HcFileExtensions proprietà o HcScriptFileExtensions con la sintassi corretta. Eventuali spazi finali, virgolette o ritorni a capo non necessari causeranno un errore di configurazione della proprietà. Sfortunatamente, adsutil.vbs non mostra un errore se si aggiunge uno spazio aggiuntivo, quindi è necessario prestare molta attenzione. Inoltre, non è possibile copiare o incollare i valori in un prompt dei comandi o nel file metabase.xml (modifica diretta della metabase) e digitarli manualmente.

  7. Controllare se la compressione è impostata a livello master, ma viene sottoposta a override da un'impostazione a livello figlio.

    La compressione verrebbe abilitata a w3svc/filters/compression livello. Tuttavia, potrebbe essere che viene sostituito da un'impostazione a livello di sito Web o di applicazione.

    Ad esempio, se è stato HcDoDynamicCompression impostato su TRUE a livello w3svc/filters/compression e per il sito Web DoDynamicCompression predefinito è impostato su FALSE, la compressione dinamica non verrà eseguita per le risposte alle richieste per il sito Web predefinito.

  8. 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 una richiesta HTTP viene gestita dalla directory di compressione IIS, potrebbe essere restituito un file a 0 byte anziché il file previsto.

    Nota

    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.

  9. Controllare se l'URL richiesto contiene una barra come parte dei parametri passati al file DLL in esecuzione.

  10. Controllare se i filtri ISAPI modificano le intestazioni della richiesta o della 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. A tale scopo sono state rilevate api ISAP di terze parti e/o non Microsoft inserendo le intestazioni nella funzione destinata al corpo dell'entità o al corpo dell'entità nella funzione pensata per le intestazioni HTTP o non fornendo intestazioni. In questo caso, elementi come il filtro ISAPI SF_NOTIFY_SEND_RESPONSE o AddResponseHeaders o la compressione dinamica avranno esito negativo. L'ISAPI deve inserire rispettivamente le intestazioni e l'entità nelle posizioni corrette.

  11. 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.

  12. Controllare se la richiesta contiene , Via: headerindica Via 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 è previsto. Pertanto, per impostazione predefinita, le risposte compresse non sono consentite quando la richiesta ha un'intestazione Via. È possibile eseguire l'override impostando la chiave della HcNoCompressionForProxies metabase su True.

  13. Controllare se la richiesta è relativa a una pagina statica e la risposta contiene il piè di pagina del documento. I piè di pagina dei documenti causeranno l'esito negativo della compressione statica.

  14. 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 di applicazioni per le estensioni .html o .txt nel server e in questo modo IIS considererà le richieste da .txt come richieste dinamiche anziché statiche e poiché .txt non è un'estensione nell'elenco di compressione dinamica, non viene compressa.

  15. Controllare se il campo Compressione IIS e Accept-Encoding: identity è presente.

    Per RFC2616, se un Accept-Encoding campo è presente in una richiesta e se il server non è in grado di inviare una risposta, che è accettabile in base all'intestazione Accept-Encoding , il server deve inviare una risposta di errore con il codice di stato 406 (non accettabile). Se non è presente alcun Accept-Encoding campo in una richiesta, il server potrebbe presumere che il client accetterà qualsiasi codifica di contenuto. In questo caso, se "identity" è uno dei codici di contenuto disponibili, il server deve usare il codice contenuto "identity", a meno che non disponga di informazioni aggiuntive che un altro codice di contenuto sia significativo per il client.

  16. 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.

    1. Creare un file di testo denominato IISProviders.txt e inserire il contenuto follow nel file." IIS: WWW Server" è il nome del provider, 0xFFFFFFFE indica la traccia per tutti gli eventi e 5 indica il livello dettagliato.

    2. Aprire un prompt dei comandi ed eseguire il comando seguente.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Riprodurre il problema.

    4. Eseguire il comando seguente per arrestare la traccia.

       logman stop trace compressionTrace -ets
      
    5. Convertire la traccia in file di testo.

      Il report di traccia converte i dati di traccia binari in testo e produce due file nella directory in cui è stato eseguito il tracerpt comando:

      tracerpt compressionTrace.etl
      
      • Summary.txt contiene dettagli generali sulla sessione di traccia, inclusi i provider usati.

      • DumpFile.csv contiene i dati di traccia effettivi in formato testo.

    6. Leggere il file di traccia per trovare informazioni utili. Aprire il dumpfile.csve 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 significa che non sono presenti corrispondenze di schema di compressione per l'estensione o la codifica Accept.This error NO_MATCHING_SCHEME means that there't compression scheme matches for this extension or Accept-Encoding. Per un elenco dettagliato degli errori di compressione, vedere l'elenco degli errori di compressione.

  17. Verificare se viene usata la traccia FREB per risolvere il problema di compressione IIS.

    Per i passaggi dettagliati, vedere Risoluzione dei problemi relativi alle richieste non riuscite tramite la traccia in IIS 7.

    Ecco un esempio di uso della traccia FREB IIS 7 per risolvere i problemi di compressione.

    Screenshot dei problemi di compressione di traccia usando i messaggi di errore.

Elenco degli errori di compressione

Per un elenco dettagliato degli errori di compressione, vedere la tabella seguente.

Nota

I motivi seguenti si applicano sia a IIS 6 che a IIS 7.

Motivo Descrizione
NO_ACCEPT_ENCODING Nessun Accept-Encoding inviato 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 di 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 ha esito positivo (200).
ALREADY_CONTENT_ENCODING Nella risposta è già presente una codifica del contenuto.

Nota

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 da giustificare la compressione.
FAIL_TO_COMPRESS Non è stato possibile creare una copia compressa.

Ulteriori informazioni