{"id":594,"date":"2017-04-26T15:41:01","date_gmt":"2017-04-26T18:41:01","guid":{"rendered":"http:\/\/gianfratti.com\/?p=594"},"modified":"2017-04-27T12:36:25","modified_gmt":"2017-04-27T15:36:25","slug":"melhore-a-performance-de-sites-com-compressao-no-iis","status":"publish","type":"post","link":"http:\/\/gianfratti.com\/index.php\/melhore-a-performance-de-sites-com-compressao-no-iis\/","title":{"rendered":"Melhore a performance de sites com compress\u00e3o no IIS"},"content":{"rendered":"<p>Com o IIS 7 da Microsoft, ficou mais simples configurar a compress\u00e3o das p\u00e1ginas \u00a0de sites e blogs, isso colabora para uma melhora da performance das p\u00e1ginas, pois reduz o tamanho dos arquivos enviados pelo servidor o que resulta em menor consumo de banda de transfer\u00eancia e redu\u00e7\u00e3o no tempo ao carregar p\u00e1ginas. <span id=\"more-299\"><\/span><\/p>\n<p>O que \u00e9 \u00a0compress\u00e3o de p\u00e1ginas de um site e como ela funciona? A compress\u00e3o de p\u00e1ginas funciona no mesmo princ\u00edpio utilizado por um compressor de arquivos, como o ZIP, por exemplo.<!--more--><\/p>\n<p>O servidor web fica respons\u00e1vel por comprimir os arquivos est\u00e1ticos, principalmente os de texto, que oferecem uma taxa de compress\u00e3o maior, e envi\u00e1-los ao navegador do cliente. Este ent\u00e3o recebe os arquivos comprimidos, realiza a descompress\u00e3o e exibe a p\u00e1gina.<\/p>\n<p>Este processo implica num aumento da carga no processador do servidor, mas tendo em vista que os processadores est\u00e3o cada vez mais poderosos e potentes, a vantagem obtida pela redu\u00e7\u00e3o do consumo de banda e do tempo de carregamento \u00e9 suficiente para justificar o uso desta funcionalidade.<\/p>\n<p>A vers\u00e3o 6 do IIS permitia a compress\u00e3o de acordo com a extens\u00e3o do arquivo (aspx, html, txt etc.), e permitia ativ\u00e1-la por site, pasta ou arquivo. As configura\u00e7\u00f5es n\u00e3o eram feitas de forma simples, pois dependiam de alguns scripts e edi\u00e7\u00e3o direta da metabase do IIS.<\/p>\n<p>Assim como em outras \u00e1reas, o IIS melhorou profundamente o gerenciamento da compress\u00e3o. Ao inv\u00e9s da compress\u00e3o por extens\u00e3o, ele permite a ativa\u00e7\u00e3o baseada no MIME TYPE, al\u00e9m de tornar mais simples a configura\u00e7\u00e3o, que pode ser feita diretamente pelo IIS Manager, atrav\u00e9s da linha de comando ou simplesmente pelo arquivo de configura\u00e7\u00e3o do site web.config, o que torna o processo muito mais simples.<\/p>\n<p>Outra melhoria que o IIS 7 trouxe foi oferecer a possibilidade de desabilitar a compress\u00e3o automaticamente quando a CPU do servidor fica sobrecarregada al\u00e9m de um limite pr\u00e9-estabelecido. Isso significa que quando o servidor est\u00e1 com pouca carga, e a sua CPU est\u00e1 sendo pouco utilizada, a compress\u00e3o vai ser utilizada normalmente. Mas, numa ocasi\u00e3o em que os acessos aumentam e passam a sobrecarregar a CPU do servidor, o IIS \u00e9 inteligente o suficiente para desabilitar automaticamente a compress\u00e3o e liberar os ciclos de processamento do processador para outras tarefas.<\/p>\n<p>O IIS suporta dois tipos de compress\u00e3o: a est\u00e1tica e a din\u00e2mica. A primeira \u00e9 utilizada para comprimir conte\u00fado est\u00e1tico do site que dificilmente sofre altera\u00e7\u00e3o, como arquivos doc, ppt, HTML e txt. Apesar de imagens serem consideradas est\u00e1ticas, elas j\u00e1 s\u00e3o comprimidas por natureza, e acabam n\u00e3o se beneficiando da compress\u00e3o realizada pelo IIS 7.<\/p>\n<p>J\u00e1 na compress\u00e3o din\u00e2mica, o IIS 7 realiza a compress\u00e3o toda vez que um cliente requisita um conte\u00fado, mas n\u00e3o a armazena em cache. Esta diferen\u00e7a permite que o conte\u00fado gerado dinamicamente atrav\u00e9s de um site em ASP.Net possa ser comprimido antes de ser enviado ao cliente.<\/p>\n<p>O IIS 7 suporta os esquemas de compress\u00e3o Deflate e GZip para comprimir o conte\u00fado retornado pelo servidor. Ambos os esquemas s\u00e3o reconhecidos pelo mercado como excelentes op\u00e7\u00f5es e podem ser ativados diretamente pelo arquivo web.config.<\/p>\n<h2>Configurando a compress\u00e3o no IIS 7<\/h2>\n<h2>Como fazer<\/h2>\n<ol>\n<li>Habilite a compacta\u00e7\u00e3o de conte\u00fado est\u00e1tico e din\u00e2mico nas features do windows<\/li>\n<li>Configure o web.config de sua aplica\u00e7\u00e3o<\/li>\n<\/ol>\n<h2>Configurando passo a passo<\/h2>\n<p>Para habilitar a compress\u00e3o de dados no IIS, primeiro tenha certeza que a feature est\u00e1 instalada. No seu windows 7\/8, abra o \u201cTurn windows features on and off\u201d e habilite \u201cDynamic e Static Content Compression\u201d conforme a figura abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-600\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_01.png\" alt=\"\" width=\"442\" height=\"495\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_01.png 442w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_01-268x300.png 268w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/p>\n<p>J\u00e1 no Windows Server 2008, v\u00e1 no \u201cServer Manager\u201d e habilite a role conforme a figura abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-601\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_02.png\" alt=\"\" width=\"480\" height=\"341\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_02.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_02-170x120.png 170w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_02-300x213.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<h2 id=\"Exemplo\">Configurando o web.config<\/h2>\n<p>Pronto, no servidor \u00e9 s\u00f3 isso, agora vamos configurar a aplica\u00e7\u00e3o. Abaixo vai um exemplo de como seria uma configura\u00e7\u00e3o. Este c\u00f3digo deve ficar dentro da tag \u201csystem.webserver\u201d.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\n&lt;system.webServer&gt;\r\n&lt;urlCompression doDynamicCompression=&quot;true&quot; doStaticCompression=&quot;true&quot; &lt;span class=&quot;crayon-v&quot;&gt;dynamicCompressionBeforeCache&lt;\/span&gt;&lt;span class=&quot;crayon-o&quot;&gt;=&lt;\/span&gt;&lt;span class=&quot;crayon-s&quot;&gt;&quot;true&quot;&lt;\/span&gt; \/&gt;\r\n&lt;\/system.webServer&gt;\r\n<\/pre>\n<p>Essa tag \u00e9 o bot\u00e3o de liga\/desliga da compress\u00e3o. O <em>dynamicCompressionBeforeCache <\/em>diz que o cache j\u00e1 ser\u00e1 feito com tudo compactado. S\u00f3 n\u00e3o deixe true aqui se acabar tendo algum problema em seus scripts.<\/p>\n<p>Em sua aplica\u00e7\u00e3o, essa \u00e9 a \u00fanica configura\u00e7\u00e3o que voc\u00ea consegue fazer. <strong>O primeiro problema que voc\u00ea vai enfrentar \u00e9 que mimeTypes do tipo aplication\/json (seus queridos webservices) n\u00e3o v\u00e3o ser compactados por padr\u00e3o<\/strong>. Para ter mais controle sobre o processo todo (e escolher os mimetypes a serem compactados por exemplo), voc\u00ea tem que configurar diretamente o n\u00f3 de servidor do seu IIS.<\/p>\n<h2 id=\"IIS\">Configurando o IIS<\/h2>\n<p>No console do IIS voc\u00ea pode configurar a compacta\u00e7\u00e3o com muito mais granularidade. Abra o IIS, clique no n\u00f3 principal e v\u00e1 no \u201cconfiguration editor\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-602\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_03.png\" alt=\"\" width=\"480\" height=\"297\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_03.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_03-300x186.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>No \u201cconfiguration editor\u201d, voc\u00ea tem essas op\u00e7\u00f5es:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-603\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_04.png\" alt=\"\" width=\"480\" height=\"381\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_04.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_04-300x238.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>Vamos falar de algumas delas:<\/p>\n<h3>scheme<\/h3>\n<p>Clique na primeira \u201cCollection\u201d e defina aqui qual tipo de compress\u00e3o ser\u00e1 usada: gzip ou deflate na maioria dos casos. Al\u00e9m disso, voc\u00ea pode configurar tamb\u00e9m o n\u00edvel de compress\u00e3o. Eu recomendo o m\u00e1ximo para conte\u00fado est\u00e1tico, j\u00e1 que estes arquivos mudam muito pouco e uma vez compactados eles v\u00e3o pro cache. J\u00e1 para o conte\u00fado din\u00e2mico, fa\u00e7a testes com seu servidor e veja o custo x benef\u00edcio em incrementar esse n\u00famero. Em minha experi\u00eancia, n\u00fameros altos gastam muito processamento e n\u00e3o aumentam em quase nada a compacta\u00e7\u00e3o. Os campos s\u00e3o \u201cstaticCompressionLevel\u201d e \u201cdynamicCompressionLevel\u201d. De novo, fa\u00e7a seus testes.<\/p>\n<h3>Trava de seguran\u00e7a em caso de muito processamento<\/h3>\n<p>Compactar o retorno para o navegador com certeza vai te economizar banda, mas vai tamb\u00e9m te custar mais processamento. Aqui podemos fazer como que o servidor pare de compactar arquivos caso o processamento aumente muito.<\/p>\n<p>Em \u201c<em>staticCompressionDisableCpuUsage<\/em>\u201d voc\u00ea diz quando o servidor deve parar de compactar arquivos. Por exemplo, quando atingir 80% de uso de cpu.<\/p>\n<p>Em \u201c<em>staticCompressionEnableCpuUsage<\/em>\u201d voc\u00ea diz em que n\u00edvel o processamento tem que baixar para que a compress\u00e3o seja ligada novamente. Por exemplo, baixou para 50%, volte a comprimir o response.<\/p>\n<h3>dynamicTypes e staticTypes<\/h3>\n<p>Aqui voc\u00ea diz que tipo de conte\u00fado vai ser compactado configurando por mimetype. Lembre-se que conte\u00fado est\u00e1tico \u00e9 quando o IIS serve um arquivo diretamente e din\u00e2mico \u00e9 todo resto. N\u00e3o esque\u00e7a de adicionar aqui o \u201capplication\/json\u201d se fizer sentido pra voc\u00ea.<\/p>\n<h3>Outros<\/h3>\n<p>H\u00e1 v\u00e1rios outros par\u00e2metros para testar, como desabilitar compress\u00e3o para proxies, m\u00e1ximo de disco a ser usado, etc. Analise seu contexto.<\/p>\n<h2>Comparando<\/h2>\n<p>Criei uma nova aplica\u00e7\u00e3o usando o template do ASP.NET MVC 4 e dei play, vamos ver o tempo de carregamento da p\u00e1gina inicial:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-604\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_05.png\" alt=\"\" width=\"480\" height=\"239\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_05.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_05-300x149.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>Levou 333ms para o navegador baixar tudo, isso porque estamos em localhost. Em um servidor remoto esse tempo seria consideravelmente maior.<\/p>\n<p>Com compress\u00e3o habilitada, a coisa j\u00e1 melhora. Perceba a diferen\u00e7a brutal no jquery:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-605\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_06.png\" alt=\"\" width=\"480\" height=\"240\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_06.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_06-300x150.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>O tempo baixou para 192ms. Veja tamb\u00e9m que o novo tamanho dos arquivos \u00e9 bem menor. Viva a compacta\u00e7\u00e3o!<\/p>\n<p>O IIS avisa o cliente que o conte\u00fado est\u00e1 compactado atrav\u00e9s de um header conforme a figura abaixo:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-606\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_07.png\" alt=\"\" width=\"480\" height=\"343\" srcset=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_07.png 480w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_07-170x120.png 170w, http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/04\/IIS_gzip_07-300x214.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>Simples, certo?<\/p>\n<p>N\u00e3o vejo por que n\u00e3o habilitar isso na maioria das aplica\u00e7\u00f5es, mas lembre-se que existe um custo extra de CPU para a compacta\u00e7\u00e3o. A funcionalidade de desligar a compacta\u00e7\u00e3o automaticamente se o processamento sobe muito \u00e9 fant\u00e1stica e nos traz um pouco de seguran\u00e7a nesse aspecto.<\/p>\n<p>Junte isso com o uso de bundle and minification de seus scripts e css e um bom uso de cache e voc\u00ea ter\u00e1 uma aplica\u00e7\u00e3o muito mais r\u00e1pida no navegador do usu\u00e1rio.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Com o IIS 7 da Microsoft, ficou mais simples configurar a compress\u00e3o das p\u00e1ginas \u00a0de sites e blogs, isso colabora para uma melhora da performance das p\u00e1ginas, pois reduz o tamanho dos arquivos enviados pelo servidor o que resulta em menor consumo de banda de transfer\u00eancia e redu\u00e7\u00e3o no tempo ao carregar p\u00e1ginas. O que <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"http:\/\/gianfratti.com\/index.php\/melhore-a-performance-de-sites-com-compressao-no-iis\/\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,15],"tags":[],"class_list":["post-594","post","type-post","status-publish","format-standard","hentry","category-net-framework","category-back-end"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=594"}],"version-history":[{"count":8,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/594\/revisions"}],"predecessor-version":[{"id":609,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/594\/revisions\/609"}],"wp:attachment":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=594"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}