Solução de problemas de compactação do IIS no IIS 6 ou IIS 7.x

Aplica-se a: Internet Information Services 6.0, Internet Information Services 7.0 e versões posteriores

Visão Geral

Habilitar a compactação HTTP para seus aplicativos Web do IIS 6 ou 7 é uma maneira de aumentar o desempenho do site.

Muitas das propriedades de compactação necessárias para gerenciar completamente o IIS não são expostas pela GUI do administrador. Ele apenas oferece um botão ativado ou desativado. Portanto, para habilitar completamente a compactação HTTP, você deve usar uma ferramenta diferente do Gerenciador do IIS para atualizar o arquivo metabase.xml . A ferramenta mais comum usada é adsutil.vbs, que está incluída no diretório de instalação do IIS.

Este artigo ajuda você a configurar a compactação e identifica as razões comuns pelas quais a compactação do IIS pode não funcionar no IIS 6 e no IIS 7.x.

Ferramentas usadas nesta solução de problemas

  • Fiddler
  • Monitor de Processos
  • Metabase ACL
  • Rastreamento de FREB do IIS 7

Verificação

Determinar se a compactação está funcionando

A única maneira de determinar se o servidor IIS enviou uma resposta compactada é analisando um rastreamento de rede da solicitação do cliente e da resposta do servidor. A solicitação do cliente deve conter o seguinte Cabeçalho de Solicitação HTTP:

HTTP: Accept-Encoding =gzip, deflate

Isso permite que o servidor saiba que o cliente está disposto a receber uma resposta compactada e dá suporte à compactação. Em troca, uma resposta compactada do servidor conterá o seguinte cabeçalho de resposta HTTP e um valor:

HTTP: Content-Encoding = gzip

As capturas de tela a seguir mostram a saída da ferramenta Fiddler quando a compactação não está funcionando:

Captura de tela da Compactação HTTP definida como Sem Compactação na guia Transformador.

Captura de tela de uma seção de compactação HTTP desabilitada na guia Transformador.

Solução de problemas de compactação

Execute as seguintes etapas para solucionar problemas de compactação:

  1. Habilitar compactação no IIS 6 ou IIS 7.

    No Gerenciador do IIS, clique com o botão direito do mouse no nó Sites da Web , selecione Propriedades e selecione Serviços.

    Captura de tela da compactação HTTP com arquivos estáticos compress selecionados e o tamanho máximo do diretório temporário definido como ilimitado.

    Captura de tela das opções de compactação habilitadas com os valores padrão.

  2. Especifique a pasta de compactação e as permissões.

    O IIS armazena arquivos compactados em uma pasta, que pode ser configurada. Por padrão, é para o %windir%\IIS Temporary Compressed Files IIS 6 e %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files para o IIS 7.

    IIS_WPG(IIS_IURS para IIS 7) deve ter permissão de controle total para esta pasta. Use o Monitor de Processo para solucionar problemas desse tipo de problema de permissão.

  3. Verifique se a compactação está habilitada no Metabase.xml.

    A compactação não está ativada na metabase nos nós certos. Há três nós de metabase para a configuração de compactação:

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

    Configurar o /parameters nó é obrigatório. Em seguida, você pode configurar ou /gzip/deflate nó ou ambos. Isso significa que a configuração apenas dos nós gzip, deflate ou parameters não funcionará. Se você configurar os /parameters nós e /gzip , o esquema de compactação Gzip será habilitado. Se você configurar os /parameters nós e /deflate , o esquema de compactação Deflate será habilitado. Por fim, se você configurar os três nós, a compactação GZip e a compactação Deflate serão habilitadas.

  4. Verifique a permissão de metabase do IIS 6.

    Por padrão, IIS_WPG tem permissões leitura, leitura não desmarcada, chaves de enumeração e gravação para o /LM/W3SVC/Filters.

    O IIS não poderá inicializar a compactação se as permissões forem removidas devido a alterações inesperadas ou se a segurança endurecer.

    Use metaacl.vbs para verificar e modificar a ACL de metabase do IIS 6. Para obter mais informações, consulte ACL metabase padrão.

    Se a identidade do pool de aplicativos (ou o IIS_WPG grupo em geral) não tiver acesso de leitura e gravação à chave de metabase W3SVC ou Filters, uma condição de COMPRESSION_DISABLED falha de será registrada em um rastreamento do ETW (Rastreamento Empresarial para Windows).

    Rastreamento etw

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Verifique se a compactação dinâmica ou estática está estática está desativada no Metabase.xml.

    Em cada um dos três nós de configuração (/parameters, /gzip, e /deflate), você tem a opção de habilitar compactação estática e/ou dinâmica. Para habilitar a compactação estática para tipos de arquivo como .txt e .html, você deve definir a HcDoStaticCompression chave como 1 (ou TRUE). Para habilitar a compactação dinâmica para tipos de arquivo como .asp, .aspx, .asmx ou .exe, você deve definir a HcDoDynamicCompression chave como 1 (ou TRUE).

    Por exemplo, para definir a /parameters compactação dinâmica no nó, execute o seguinte comando usando adsutil.vbs:

    cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
    

    A saída do comando anterior é semelhante a esta:

    HcDoDynamicCompression          : (BOOLEAN) True
    

    No IIS7

    <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
    
  6. Verifique se o tipo de arquivo que você deseja compactar está listado nas seções extensões de arquivo apropriadas nos /gzip nós e /deflate .

    Depois de ativar a compactação com as HcDoDynamicCompression chaves e/ou HcDoStaticCompression , especifique quais tipos de arquivo devem ser realmente compactados. Por padrão, a compactação STATIC usa tipos de arquivo como .htm, .html e compactação .txt e DYNAMIC usa .asp, .dll e .exe. Se você quiser compactar diferentes tipos de arquivo, por exemplo, .aspx, adicione-o à seção de extensão de arquivo apropriada nos /gzip nós e ou /deflate , dependendo do tipo de compactação que você está usando. Para compactação de arquivo estático (como .html, txt e xml), adicione as extensões de arquivo à HcFileExtensions propriedade. Para compactação dinâmica (como .asp, .aspx e .asmx) adicione-a à HcScriptFileExtension propriedade.

    Para arquivos estáticos

    adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
    
    adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
    

    O comando anterior mostra a seguinte saída:

    HcFileExtensions : (LIST)  (3 Items)
    "htm"
    "html"
    "txt"
    

    Para arquivos dinâmicos

    adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
    

    O comando anterior mostra a seguinte saída:

    HcFileExtensions : (LIST)  (4 Items)
    "asp"
    "dll"
    "exe"
    "aspx"
    

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

    Observação

    Você deve configurar as HcFileExtensions propriedades ou HcScriptFileExtensions com a sintaxe correta. Quaisquer espaços à direita ou aspas desnecessárias ou retornos de transporte farão com que a propriedade seja configurada incorretamente. Infelizmente, adsutil.vbs não mostrará um erro se você adicionar um espaço extra, portanto, você precisa ter muito cuidado. Além disso, você não pode copiar ou colar os valores em um prompt de comando ou no arquivo metabase.xml (edição direta de metabase) e deve digitá-los manualmente.

  7. Verifique se a compactação está definida no nível master, mas está sendo substituída por uma configuração em um nível filho.

    A compactação seria habilitada no w3svc/filters/compression nível. No entanto, pode ser que ele esteja sendo substituído por uma configuração no nível do site ou aplicativo.

    Por exemplo, se você tiver HcDoDynamicCompression definido como TRUE no w3svc/filters/compression nível e para o site padrão tiver DoDynamicCompression definido como FALSE, a compactação dinâmica não ocorrerá para respostas a solicitações para o site padrão.

  8. Verifique se um programa antivírus examinou o diretório em que os arquivos compactados são salvos.

    Quando a compactação é habilitada em um servidor que executa o IIS e uma solicitação HTTP é atendida do diretório de compactação do IIS, um arquivo de 0 bytes pode ser retornado em vez do arquivo esperado.

    Observação

    Você só poderá ver esses sintomas se a Compactação Estática HTTP estiver habilitada.

    Isso acontece porque um software antivírus em execução no servidor IIS está verificando o diretório de compactação do IIS.

    Portanto, você precisaria excluir o diretório de compactação do IIS da lista de verificação do software antivírus.

  9. Verifique se a URL que está sendo solicitada contém uma barra como parte dos parâmetros passados para o arquivo DLL em execução.

  10. Verifique se os filtros ISAPI modificam os cabeçalhos de solicitação ou resposta.

    Um ISAPI está fazendo a operação de envio e não está enviando o conjunto completo de cabeçalhos HTTP junto com a entidade para HTTP_COMPRESSION::DoDynamicCompression. Como DoDynamicCompression não recebe todos os dados do ISAPI, não podemos compactar a resposta. IsAPIs de terceiros e/ou não microsoft foram vistos para fazer isso colocando os cabeçalhos na função destinada ao corpo da entidade ou ao corpo da entidade na função destinada aos cabeçalhos HTTP ou não fornecendo cabeçalhos. Quando isso acontecer, coisas como o filtro ISAPI SF_NOTIFY_SEND_RESPONSE ou AddResponseHeaders ou compactação dinâmica falharão. O ISAPI precisa colocar os cabeçalhos e a entidade nos locais certos, respectivamente.

  11. Verifique se o código de status de resposta é algo diferente de 200. No IIS 6 ou 7, somente as respostas com um status HTTP 200 serão compactadas.

    A resposta com status códigos que não sejam 200 não será compactada. Você precisa escrever um HTTPModule para alcançar o mesmo.

  12. Verifique se a solicitação contém um Via: header, o Via headers indica que a solicitação está chegando ao IIS por meio de um proxy.

    Muitos proxies não manipulam o cabeçalho de compactação corretamente e fornecem dados compactados aos clientes quando eles não devem. Portanto, por padrão, as respostas compactadas não são permitidas quando a solicitação tem um cabeçalho Via. Você pode substituir isso definindo a chave metabase HcNoCompressionForProxies como True.

  13. Verifique se a solicitação é para uma página estática e a resposta contém o rodapé do documento. Os rodapés de documento farão com que a compactação estática falhe.

  14. Verifique se a compactação estática não está funcionando. Isso pode acontecer se você tiver um mapeamento de aplicativo curinga instalado no nível raiz no IIS. Por exemplo, temos mapeamentos de aplicativos para as extensões .html ou .txt no servidor e isso fará com que o IIS considere suas solicitações para .txt como solicitações dinâmicas em vez de estáticas e, como .txt não é uma extensão na lista de compactação dinâmica, ela não é compactada.

  15. Verifique se a Compactação do IIS e Accept-Encoding: identity o campo estão presentes.

    Por RFC2616, se um Accept-Encoding campo estiver presente em uma solicitação e se o servidor não puder enviar uma resposta, o que é aceitável de acordo com o Accept-Encoding cabeçalho, o servidor deverá enviar uma resposta de erro com o código 406 (Não Aceitável) status. Se nenhum Accept-Encoding campo estiver presente em uma solicitação, o servidor poderá assumir que o cliente aceitará qualquer codificação de conteúdo. Nesse caso, se "identidade" for um dos códigos de conteúdo disponíveis, o servidor deverá usar o código de conteúdo "identidade", a menos que tenha informações adicionais de que um código de conteúdo diferente é significativo para o cliente.

  16. Verifique se você está usando o rastreamento ETW para solucionar problemas de compactação do IIS.

    O rastreamento de eventos para ETW (Windows) é um recurso do sistema operacional Windows que permite solucionar problemas com solicitações HTTP.

    Aqui estão as etapas para solucionar problemas de compactação do IIS.

    1. Crie um arquivo de texto chamado IISProviders.txt e coloque o conteúdo a seguir no arquivo". IIS: WWW Server" é o nome do provedor, 0xFFFFFFFE significa rastreamento para todos os eventos e 5 significa nível verboso.

    2. Abra um prompt de comando e execute o comando a seguir.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. Reproduza o problema.

    4. Execute o comando a seguir para interromper o rastreamento.

       logman stop trace compressionTrace -ets
      
    5. Converta o rastreamento em arquivo de texto.

      O relatório de rastreamento converte os dados de rastreamento binários em texto e produz dois arquivos no diretório em que você executou o tracerpt comando:

      tracerpt compressionTrace.etl
      
      • Summary.txt contém detalhes gerais sobre a sessão de rastreamento, incluindo quais provedores foram usados.

      • DumpFile.csv contém os dados de rastreamento reais em um formato de texto.

    6. Leia o arquivo de rastreamento para encontrar informações úteis. Abra o dumpfile.csve encontre palavra-chave como COMPRESSION_NOT_SUCCESS. Veja um exemplo:

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    Esse erro NO_MATCHING_SCHEME significa que não havia correspondências de esquema de compactação para essa extensão ou aceitação de codificação. Para obter uma lista detalhada de erros de compactação, consulte a Lista de erros de compactação.

  17. Verifique se o rastreamento FREB para solucionar problemas de compactação do IIS é usado.

    Para obter etapas detalhadas, consulte Solução de problemas de solicitações com falha usando o rastreamento no IIS 7.

    Aqui está um exemplo de como usar o rastreamento FREB do IIS 7 para solucionar problemas de compactação.

    Captura de tela do rastreamento de problemas de compactação usando as mensagens de erro.

Lista de erros de compactação

Para obter uma lista detalhada de erros de compactação, consulte a tabela a seguir.

Observação

Os motivos a seguir se aplicam ao IIS 6 e ao IIS 7.

Reason Descrição
NO_ACCEPT_ENCODING Nenhum Accept-Encoding enviado pelo cliente.
COMPRESSION_DISABLED a compactação está desabilitada porque nenhuma configuração adequada foi encontrada.
NO_COMPRESSION_10 Servidor não configurado para compactar solicitações 1.0.
NO_COMPRESSION_PROXY Servidor não configurado para compactar solicitações de proxy.
NO_MATCHING_SCHEME Nenhum esquema de compactação corresponde a essa extensão/Codificação de Aceitação.
UNKNOWN_ERROR Erro desconhecido.
NO_COMPRESSION_RANGE Servidor não configurado para compactar solicitações de intervalo
FILE_TOO_SMALL Arquivo menor que o limite de compactação.
FILE_ENCRYPTED Arquivo criptografado.
COMPRESS_FILE_NOT_FOUND A cópia compactada não existe.
COMPRESS_FILE_STALE Cópia compactada desatualizada.
NO_MATCHING_CONTENT_TYPE Servidor não configurado para compactar o tipo de conteúdo para essa extensão.
HEADERS_SENT_TWICE Cabeçalhos sendo enviados duas vezes para a mesma resposta.
NO_HEADER_SENT Nenhum cabeçalho enviado antes do envio do corpo da entidade.
NOT_SUCCESS_STATUS O código de status de resposta não é bem-sucedido (200).
ALREADY_CONTENT_ENCODING Há uma codificação de conteúdo já presente na resposta.

Observação

Os motivos a seguir se aplicam apenas ao IIS 7.

Reason Descrição
FOOTER_ENABLED Rodapé de documento habilitado para arquivos estáticos.
NOT_FREQUENTLY_HIT A URL não foi solicitada com frequência suficiente para justificar a compactação.
FAIL_TO_COMPRESS A cópia compactada não pôde ser criada.

Mais informações