Condividi tramite


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:

Screenshot della compressione HTTP impostata su Nessuna compressione nella scheda Trasformatore.

Screenshot di una sezione di compressione HTTP disabilitata nella scheda Transformer.

Risoluzione dei problemi di compressione

Per risolvere i problemi di compressione, seguire questa procedura:

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

    Screenshot della compressione HTTP con l'opzione Comprimi file statici selezionata e la dimensione massima della directory temporanea impostata su illimitata.

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

  4. 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 di COMPRESSION_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
    
  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 estensioni di file appropriate 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 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 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>
    

    Note

    È necessario configurare le HcFileExtensions proprietà o HcScriptFileExtensions 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.

  7. 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 su TRUE a livello w3svc/filters/compression e per il sito Web predefinito è DoDynamicCompression impostata su FALSE, la compressione dinamica non si verificherà 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 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.

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

  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 un Via: headeroggetto , indica 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 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 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 del documento causeranno un errore di 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 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.

  15. 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'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 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.

  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 nel file." IIS: WWW Server" è il nome del provider, 0xFFFFFFFE significa 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 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.

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

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

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

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.

Ulteriori informazioni