André Carlucci

Skeptic .net development

Como habilitar compressão gzip no IIS?

Uma forma simples e fácil de aumentar a performance em nossas aplicações web é habilitar a compressão de dados entre o servidor e o navegador do usuário.

Como fazer explicado em 5s

  1. Habilite a compactação de conteúdo estático e dinâmico nas features do windows
  2. Configure o web.config de sua aplicação adaptando esse exemplo

Configurando passo a passo

Para habilitar a compressão de dados no IIS, primeiro tenha certeza que a feature está instalada. No seu windows 7/8, abra o “Turn windows features on and off” e habilite “Dynamic e Static Content Compression” conforme a figura abaixo:

Já no Windows Server 2008, vá no “Server Manager” e habilite a role conforme a figura abaixo:

Configurando o web.config

Pronto, no servidor é só isso, agora vamos configurar a aplicação. Abaixo vai um exemplo de como seria uma configuração. Este código deve ficar dentro da tag “system.webserver”.

Essa tag é o botão de liga/desliga da compressão. O dynamicCompressionBeforeCache diz que o cache já será feito com tudo compactado. Só não deixe true aqui se acabar tendo algum problema em seus scripts.

Em sua aplicação, essa é a única configuração que você consegue fazer. O primeiro problema que você vai enfrentar é que mimeTypes do tipo aplication/json (seus queridos webservices) não vão ser compactados por padrão. Para ter mais controle sobre o processo todo (e escolher os mimetypes a serem compactados por exemplo), você tem que configurar diretamente o nó de servidor do seu IIS.

Configurando o IIS

No console do IIS você pode configurar a compactação com muito mais granularidade. Abra o IIS, clique no nó principal e vá no “configuration editor”.

No “configuration editor”, você tem essas opções:

Vamos falar de algumas delas:

scheme

Clique na primeira “Collection” e defina aqui qual tipo de compressão será usada: gzip ou deflate na maioria dos casos. Além disso, você pode configurar também o nível de compressão. Eu recomendo o máximo para conteúdo estático, já que estes arquivos mudam muito pouco e uma vez compactados eles vão pro cache. Já para o conteúdo dinâmico, faça testes com seu servidor e veja o custo x benefício em incrementar esse número. Em minha experiência, números altos gastam muito processamento e não aumentam em quase nada a compactação. Os campos são “staticCompressionLevel” e “dynamicCompressionLevel”. De novo, faça seus testes.

Trava de segurança em caso de muito processamento

Compactar o retorno para o navegador com certeza vai te economizar banda, mas vai também te custar mais processamento. Aqui podemos fazer como que o servidor pare de compactar arquivos caso o processamento aumente muito.

Em “staticCompressionDisableCpuUsage” você diz quando o servidor deve parar de compactar arquivos. Por exemplo, quando atingir 80% de uso de cpu.

Em “staticCompressionEnableCpuUsage” você diz em que nível o processamento tem que baixar para que a compressão seja ligada novamente. Por exemplo, baixou para 50%, volte a comprimir o response.

dynamicTypes e staticTypes

Aqui você diz que tipo de conteúdo vai ser compactado configurando por mimetype. Lembre-se que conteúdo estático é quando o IIS serve um arquivo diretamente e dinâmico é todo resto. Não esqueça de adicionar aqui o “application/json” se fizer sentido pra você.

Outros

Há vários outros parâmetros para testar, como desabilitar compressão para proxies, máximo de disco a ser usado, etc. Analise seu contexto.

Comparando

Criei uma nova aplicação usando o template do ASP.NET MVC 4 e dei play, vamos ver o tempo de carregamento da página inicial:

Levou 333ms para o navegador baixar tudo, isso porque estamos em localhost. Em um servidor remoto esse tempo seria consideravelmente maior.

Com compressão habilitada, a coisa já melhora. Perceba a diferença brutal no jquery:

O tempo baixou para 192ms. Veja também que o novo tamanho dos arquivos é bem menor. Viva a compactação!

O IIS avisa o cliente que o conteúdo está compactado através de um header conforme a figura abaixo:

Simples, certo?

Não vejo por que não habilitar isso na maioria das aplicações, mas lembre-se que existe um custo extra de CPU para a compactação. A funcionalidade de desligar a compactação automaticamente se o processamento sobe muito é fantástica e nos traz um pouco de segurança nesse aspecto.

Junte isso com o uso de bundle and minification de seus scripts e css e um bom uso de cache e você terá uma aplicação muito mais rápida no navegador do usuário.

  • Fabiano Leal

    Qual a aplicação você usou para medir o tempo de resposta do site?

    • andrecarlucci

      Oi Fabiano, é o próprio Chrome. Basta apertar F12 e ir na aba “network”. Tem no IE também :)

  • Fabiano Leal

    É cara, percebi e fiz os testes. Mesmo assim valeu pela resposta.

  • Jefferson Santos

    André, muito obrigado por essas dicas e por compartilhar com a gente. Abs.

    • andrecarlucci

      Valeu!

  • Daniela Moreira

    No Windows Server 2012 R2 Core é só habilitar a compactação de conteúdo estático e dinâmico e inserir o exemplo nno web.config do meu projeto também?