Compartilhar via


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

Aplica-se a: Serviços de Informações da Internet 6.0, Serviços de Informações da Internet 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 de administração. Ele apenas oferece um botão liga ou desliga. 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 os motivos comuns pelos 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
  • Process Monitor
  • Metabase ACL
  • Rastreamento FREB do IIS 7

Verificação

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

Captura de tela de uma seção de compactação HTTP desativada na guia Transformer.

Solução de problemas de compactação

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

  1. Habilite a compactação no IIS 6 ou IIS 7.

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

    Captura de tela da compactação HTTP com Compactar arquivos estáticos selecionado 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, é %windir%\IIS Temporary Compressed Files para o 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 essa pasta. Use o Monitor de Processo para solucionar esse 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

    A configuração do /parameters nó é obrigatória. Em seguida, você pode configurar um ou /gzip /deflate nó, ou ambos. Isso significa que configurar apenas os 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á ativado. Se você configurar os /parameters nós e /deflate , o esquema de compactação Deflate será ativado. Finalmente, se você configurar todos os três nós, a compactação GZip e a compactação Deflate serão habilitadas.

  4. Verifique a permissão da metabase para o IIS 6.

    Por padrão, IIS_WPG tem permissões de Leitura, Leitura Não Segura, Enumerar Chaves e Gravar para o /LM/W3SVC/Filters.

    O IIS não poderá inicializar a compactação se as permissões tiverem sido removidas devido a alterações inesperadas ou se a segurança for reforçada.

    Use metaacl.vbs para verificar e modificar a ACL da metabase do IIS 6. Para obter mais informações, consulte ACL de 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 Filtros, uma condição de falha será registrada em um rastreamento ETW (Rastreamento Empresarial para COMPRESSION_DISABLED 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á 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 ativar a 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 compactação dinâmica no /parameters 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 apropriadas de Extensões de Arquivo nos /gzip nós e /deflate .

    Depois de ativar a compactação com as HcDoDynamicCompression teclas 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 .txt e a compactação 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 or HcScriptFileExtensions com a sintaxe correta. Quaisquer espaços à direita ou aspas desnecessárias ou retornos de carro farão com que a propriedade seja configurada incorretamente. Infelizmente, o adsutil.vbs não mostra um erro se você adicionar um espaço extra, então 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 da metabase) e deve digitá-los manualmente.

  7. Verifique se a compactação está definida no nível mestre, 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 do 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 verificou o diretório onde 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 byte 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::DoDynamicCompressiono . Como DoDynamicCompression não recebe todos os dados do ISAPI, não podemos compactar a resposta. Verificou-se que ISAPIs de terceiros e/ou que não são da Microsoft fazem isso colocando os cabeçalhos na função destinada ao corpo da entidade ou o corpo da entidade na função destinada aos cabeçalhos HTTP ou não fornecendo nenhum cabeçalho. Quando isso acontece, situações como o filtro ISAPI SF_NOTIFY_SEND_RESPONSE ou AddResponseHeaders ou a compactação dinâmica falharão. O ISAPI precisa colocar os cabeçalhos e a entidade nos locais corretos, respectivamente.

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

    A resposta com códigos de status diferentes de 200 não será compactada. Você tem que escrever um HTTPModule para conseguir o mesmo.

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

    Muitos proxies não lidam com o cabeçalho de compactação corretamente e fornecem dados compactados aos clientes quando não deveriam. 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 da HcNoCompressionForProxies metabase como True.

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

  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 o campo Compactação e Accept-Encoding: identity do IIS está presente.

    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 de status 406 (Não Aceitável). Se nenhum Accept-Encoding campo estiver presente em uma solicitação, o servidor poderá presumir 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 ETW (Rastreamento de Eventos para Windows) é um recurso do sistema operacional Windows que permite solucionar problemas com solicitações HTTP.

    Aqui estão as etapas para solucionar o problema 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 detalhado.

    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 informações 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.csv e encontre palavras-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 houve correspondências de esquema de compactação para essa extensão ou Accept-Encoding. 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 Solucionando problemas de solicitações com falha usando 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.

Motivo Descrição
NO_ACCEPT_ENCODING Nenhuma codificação de aceitação enviada pelo cliente.
COMPRESSION_DISABLED A compactação está desativada porque nenhuma configuração adequada foi encontrada.
NO_COMPRESSION_10 O servidor não está 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/Accept-Encoding.
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 O servidor não está configurado para compactar content-Type para esta 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 foi 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 somente ao IIS 7.

Motivo Descrição
FOOTER_ENABLED Rodapé do documento habilitado para arquivos estáticos.
NOT_FREQUENTLY_HIT O URL não foi solicitado com frequência suficiente para justificar a compactação.
FAIL_TO_COMPRESS Não foi possível criar uma cópia compactada.

Mais informações