No nosso último post falamos sobre as configurações de servidores virtuais no Apache. Nesta postagem, vamos falar sobre algo muito importante que é a compactação de conteúdo do servidor para que seja então enviado aos clientes.
Durante a navegação na internet todos nós já nos deparamos com páginas pesadas, que demoram bastante tempo para carregar. É certo que nem sempre a culpa é do código html da página, podendo ser da infraestrutura. O importante a ser notado é que lentidão na internet é muito estressante, e caso seu site esteja lento, saiba que seus visitantes tendem a não retornar mais a ele. Outro ponto a ser considerado é o tráfego de rede, podendo ser muito intenso, no caso de sites ou aplicações web com número grande de usuários simultâneos. Com tráfego de rede intenso, é provável que os clientes esperarão mais tempo para que uma resposta do servidor chegue a eles. Um outro ponto a ser considerado é que para respostas grandes do servidor, a fila de espera pode ficar ainda pior para os usuários, por isso a compactação de conteúdo no lado servidor é muito importante.
A compactação, nada mais é do que executar algum algoritmo de compactação nos dados enviados do servidor para o cliente. No servidor Apache, essa configuração é feita habilitando o módulo mod_deflate. Em versões antigas usava-se o mod_gzip, porém devido à falhas de segurança encontradas no mod_gzip, o indicado agora é o uso do mod_deflate.
Indice
- Descrição do mod_deflate
- Fluxo de uma requisição HTTP
- Configurações
- Testando a Configuração
- Conclusão
Descrição do mod_deflate
O mod_deflate permite comprimir de forma automática o conteúdo enviado aos clientes, de forma a economizar banda e a reduzir o tempo de carregamento das páginas. Se os sites hospedados no servidor utilizam páginas com grandes volumes de texto, a redução pode ser bastante significativa.
O uso de compressão é negociado entre o servidor e o cliente no momento em que ele requisita a página, de forma que você não precisa se preocupar em excluir navegadores móveis ou clientes com browsers antigos. Ao perceber que o cliente não suporta o recurso, o servidor simplesmente envia a página sem compressão.
O uso do deflate aumenta sutilmente o uso de processamento no servidor, já que ele terá o trabalho de comprimir cada página solicitada antes de enviá-la ao cliente, mas isso é compensado pelo fato de o cliente demorar menos tempo para carregar cada página, o que permite que o servidor mantenha um número menor de instâncias do Apache carregadas na memória.
Do ponto de vista do cliente, o deflate é bastante benéfico, pois o texto das páginas carrega mais rápido. Uma página html comprimida pelo deflate fica com, tipicamente, um quarto do tamanho original. Com isso, uma página de 100 KB, que demoraria até 15 segundos para ser carregada por um cliente acessando via modem, passaria a ser carregada em apenas 3 ou 4 segundos. Depois disso, ainda teríamos o tempo de carregamento das imagens e de outros elementos da página, como de praxe, mas com o html carregado o cliente pode já ir adiantando a leitura.
Note que, as "páginas em html" que citei no parágrafo anterior, incluem também páginas dinâmicas em php e em outras linguagens, pois, de qualquer forma, depois de serem processadas pelo servidor, elas são enviadas ao cliente como uma página html.
Fluxo de uma requisição HTTP
Para entendermos melhor como esse módulo do Apache funciona, precisamos entender como uma requisição HTTP funciona. Pois bem, quando um site é acessado, o navegador realiza diversos pedidos de arquivos ao servidor, e este por sua vez, envia para o cliente, uma resposta para cada pedido do navegador. Nestes pedidos são enviados informações referente ao tipo de conteúdo, linguagem esperada, e etc. Isto é conhecido como Request Header ou Cabeçalho de Requisição. Após este pedido, o servidor retorna a resposta, com as imagens, textos, estilos e etc. Este é o Response Header ou Cabeçalho de Resposta. Para um site comum são enviados em média 80 Requests Headers e recebidos consequentemente 80 Responses Headers. Para cada pedido uma resposta. Para acessar uma página como a do http://www.terra.com.br o navegador realiza cerca de 400 requests iniciais, daí podemos começar a perceber a importância de compactação de conteúdo do response header.
- 1. navegador solicita algum arquivo ao servidor
- 2. servidor encontra o arquivo e lê
- 3. servidor retorna o arquivo com código 200 (OK)
- 4. navegador exibe o resultado da página aplicada com o estilo CSS
Configurações
Para ativar o mod_deflate, basta que seja descomentada a linha responsável por seu carregamento no arquivo "httpd.conf", a linha exata pode ser visualizada na figura 1 abaixo.
Figura 1 - Habilitando o mod_deflate no arquivo httpd.conf
A tarefa de configurar o mod_deflate pode ser feita de duas formas a depender de como está configurado o seu servidor. Caso seu servidor esteja preparado para servir apenas um domínio e utilizando as configurações globais, que é o padrão já configurado durante a instalação do Apache, abaixo temos a figura 2 que exibe o conteúdo a ser adicionado ao arquivo httpd.conf para habilitar a compressão de conteúdo, lidar com browsers não compatíveis e realizar log da compactação
Figura 2 - Configurando o mod_deflate no arquivo httpd.conf
Abaixo temos o conteúdo na forma de texto que deve ser adicionado ao httpd.conf, reparem que é o mesmo texto da imagem.
#verifica se o mod_deflate está carregado <IfModule mod_deflate.c> #habilita o deflate SetOutputFilter DEFLATE #define o nível de compressão DeflateCompressionLevel 9 #corrige imcompatibilidade com browsers que não suportam o mod_deflate BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # Exclui as seguintes extensões: gif,jpg,png,mp3,mp4,avi,rar,zip,pdf,swf # essas extensões já apresentam conteúdo compactado. SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|mp3|mp4|avi|rar|zip|pdf|swf)$ no-gzip dont-vary #Criando deflate_log DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate CustomLog logs/deflate_log deflate </IfModule>
Se você utiliza o Apache de forma mais profissional e deseja aprender a configurar a compactação de conteúdo para domínios específicos definidos em blocos <virtualhost>, apesar de um pouco diferente, a configuração também é simples, conforme pode ser visto abaixo na figura 3.
Figura 3 - Configurando o mod_deflate no arquivo httpd-vhosts.conf
Repare que é o mesmo conteúdo da configuração global já exibida em texto logo acima, porém sem a verificação de carregamento do módulo. Com isso já podemos configurar o mod_deflate para atender à todos os domínios do servidor, ou apenas à domínios específicos. Na próxima seção serão mostrados testes simples, para podermos visualizar o poder da compressão e a economia de tráfego de rede.
Testando a Configuração
Para os testes, vamos utilizar a configuração exibida para servidores virtuais exibida neste post. Esta decisão foi tomada para podermos mostrar de forma rápida e clara a diferença no consumo de tráfego de rede utilizando o mod_deflate.
Nas configurações do servidor virtual www.exemplo.com foram adicionadas as configurações do mod_deflate exibidas acima, de forma que o servidor virtual está como na figura 3. Após configurar o apache com os servidores virtuais e o mod_deflate, deve ser criada uma página com um texto muito grande, como esta. Copie esta página para os seus servidores virtuais www.exemplo.com e www.outroexemplo.com.
Após a cópia dos arquivos, basta iniciar o serviço do apache e testarmos em um navegador. No nosso caso, testamos utilizando o google chrome, devido às ferramentas para desenvolvedores.
Basta abrirmos o navegador e digitarmos o endereço do nosso site com mod_deflate configurado que é o www.exemplo.com. Logo após o carregamento da página, abra o painel para desenvolvedores que geralmente é a tecla f12 e clique na aba network. Abaixo segue a figura 4, exibindo o tamanho original da página e o tamanho do arquivo enviado ao usuário.
Figura 4 - Exibição do resultado de compressão do mod_deflate no google chrome.
Na figura 5 abaixo, podemos ver o domínio www.outroexemplo.com servindo a mesma página sem compressão de dados.
Figura 5 - Exibição do resultado sem compressão do mod_deflate no google chrome.
Conclusão
Reparando nas figuras 4 e 5, podemos ver que o nível de compressão para arquivos html e texto é muito bom. Na nosso domínio de teste com mod_deflate ativado, o tamanho do arquivo enviado ao cliente foi de apenas 160kb, contra 433kb do domínio sem o mod_deflate ativado.
Mas nem tudo são flores, podemos perceber também que o mod_deflate, torna o servidor um pouco mais pesado, pois o apache tem que comprimir o response ao cliente, demandando tempo de processamento e memória. Nos testes em localhost, é melhor deixar o mod_deflate desativado, pois não temos que fazer nenhum download, porém em um domínio muito acessado, a economiza de banda utilizada vale muito a pena.
Nenhum comentário:
Postar um comentário