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:
Solução de problemas de compactação
Execute as seguintes etapas para solucionar problemas de compactação:
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.
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.
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.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 paraCOMPRESSION_DISABLED
Windows).Rastreamento ETW
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
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 aHcDoStaticCompression
chave como1
(ouTRUE
). Para habilitar a compactação dinâmica para tipos de arquivo como .asp, .aspx, .asmx ou .exe, você deve definir aHcDoDynamicCompression
chave como1
(ouTRUE
).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>
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/ouHcDoStaticCompression
, 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 orHcScriptFileExtensions
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.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 comoTRUE
now3svc/filters/compression
nível e para o site padrão tiverDoDynamicCompression
definido comoFALSE
, a compactação dinâmica não ocorrerá para respostas a solicitações para o site padrão.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.
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.
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
o . ComoDoDynamicCompression
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.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.Verifique se a solicitação contém um
Via: header
, o indicaVia 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 comoTrue
.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.
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.
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 oAccept-Encoding
cabeçalho, o servidor deverá enviar uma resposta de erro com o código de status 406 (Não Aceitável). Se nenhumAccept-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.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.
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.
Abra um prompt de comando e execute o comando a seguir.
logman start trace compressionTrace -pf IISProviders.txt -ets
Reproduza o problema.
Execute o comando a seguir para interromper o rastreamento.
logman stop trace compressionTrace -ets
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.
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.
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.
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. |