GDH Press: Blog » Módulos do Apache: rewrite e deflate
 
RSS

Módulos do Apache: rewrite e deflate

agosto 20, 2008 – 4:11 pm

O principal ponto forte do Apache é o grande volume de módulos disponíveis para ele. Sempre que você precisa de algum recurso em especial, o primeiro passo é fazer uma pesquisa na web por algum módulo que desempenhe a função desejada. Se o recurso que precisa for uma necessidade comum, muito provavelmente você encontrará um módulo já pronto que se propõe a resolver o problema.

Como tanto o servidor Apache quanto a maior parte dos módulos disponíveis são open-source, existe também a possibilidade de modificar módulos já existentes, adicionando novas funções ou adaptando-os ao que precisa, ou mesmo desenvolver novos módulos do zero. Dois exemplos de módulos úteis são o mod_rewrite e o mod_deflate, que você provavelmente vai querer manter ativos no seu servidor.

O mod_rewrite tem a função de reescrever URLs a partir de um conjunto de parâmetros especificado por você. O uso mais simples para ele é quando você muda o domínio de acesso do site e quer que todos os links sejam redirecionados para o novo endereço.

Imagine, por exemplo, que você migrou do http://dominio.provedor.com.br para http://www.dominio.com.br. Você poderia simplesmente criar um arquivo "index.php" no diretório raiz do antigo endereço com o seguinte conteúdo:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("location:
http://www.dominio.com.br");
exit;
?>

Este é um modelo simples de redirecionamento, que faz com que o servidor passe a encaminhar os acessos para o endereço especificado, usando o código 301, que indica que a página mudou permanentemente de endereço.

O problema é que fazendo isso o redirecionamento funcionaria apenas para os visitantes que acessassem a página principal do site. Um visitante que tentasse acessar o "http://dominio.provedor.com.br/produtos/index.php?id=312", por exemplo, receberia um erro 404.

Usando o mod_rewrite, você poderia solucionar isso de forma muito simples. O primeiro passo é verificar se o módulo está carregado na configuração do Apache 2. No caso das distribuições derivadas do Debian, você pode ativá-lo usando o comando a2enmod:

# a2enmod rewrite

Muito provavelmente você receberá um "This module is already enabled!" como resposta, já que ele vem ativo por padrão na maioria das instalações. No caso do Fedora, CentOS e outras distribuições derivadas do Red Hat, verifique o arquivo "/etc/httpd/conf/httpd.conf" e, caso necessário, descomente as linhas:

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Depois de checar a ativação do módulo, falta apenas a configuração, que é feita através do arquivo ".htaccess", criado no diretório raiz do site antigo (ou seja, na pasta de arquivos do "http://dominio.provedor.com.br"). Embora o .htaccess seja geralmente associado com o uso de senhas, ele na verdade tem diversos outros usos, incluindo a configuração do mod_rewrite.

Para que o mod_rewrite passe a encaminhar todas as requisições automaticamente, o conteúdo do arquivo ".htaccess" seria:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule (.*) http://www.dominio.com.br/$1 [R=301,L]
</IfModule>

A linha "RewriteEngine On" é a responsável por encaminhar as requisições ao mod_rewrite, enquanto a linha "RewriteRule (.*) http://www.dominio.com.br/$1 [R=301,L]" explica o que deve ser feito.

Apesar de parecer estranha à primeira vista, ela segue na verdade uma lógica bastante simples. O "(.*)" cria uma regra de encaminhamento, que será aplicada a qualquer URL dentro do domínio. A página especificada pelo visitante ao acessar o site vira uma variável ($1), que é então usada no parâmetro seguinte, o "http://www.dominio.com.br/$1" onde é indicado o novo domínio do site.

Com isso, se o visitante tentar acessar o "http://dominio.provedor.com.br/produtos/index.php?id=312" do exemplo anterior, a variável "$1" será carregada com o valor "produtos/index.php?id=312" e ele será encaminhado ao "http://www.dominio.com.br/produtos/index.php?id=312". O mesmo se aplica a qualquer outra URL que ele vier a tentar acessar.

Concluindo, o "[R=301,L]" é o código de retorno que será enviado ao cliente. No caso estamos usando o código 301, que é o código de redirecionamento permanente. Além de encaminhar os visitantes, ele faz com que o Google indexe a nova página e transfira o pagerank da página antiga para ela. Normalmente, a atualização do pagerank demora cerca de 3 meses, mas depois de feita a atualização o novo endereço deverá receber o mesmo pagerank do antigo.

Outro uso comum para o mod_rewrite é a simplificação dos links, transformando URLs de páginas dinâmicas, como, por exemplo, "http://www.dominio.com.br/produtos/index.php?id=312" em URLs mais simples, como "http://www.dominio.com.br/produtos/312/" ou "http://www.dominio.com.br/312.htm"

Nesse caso, criamos regras do rewrite que o orientam a detectar acessos à URL simplificada e encaminhar as requisições para a URL "real" de forma transparente, novamente através do uso de variáveis.

Para converter as URLs do formato "http://www.dominio.com.br/index.php?id=numero" para "http://www.dominio.com.br/numero/", você usaria o seguinte modelo de arquivo .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule (.*)/$ /index.php?id=$1
</IfModule>

Com isso, ao acessar o "http://www.dominio.com.br/512/", por exemplo, o visitante veria a página "http://www.dominio.com.br/index.php?id=512", o que mascara a complexidade da URL.

O mod_deflate permite comprimir de forma automática as páginas html (e também outros tipos de arquivos) enviados 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.

Nas distribuições derivadas do Debian, o módulo é ativado usando o a2enmod:

# a2enmod deflate

Nas distribuições derivadas do Red Hat, verifique se a linha a seguir está presente dentro da seção "Dynamic Shared Object (DSO) Support" do arquivo "/etc/httpd/conf/httpd.conf". Adicione-a manualmente caso necessário (não se esqueça de reiniciar o Apache para que a configuração entre em vigor):

LoadModule deflate_module modules/mod_deflate.so

Esta linha tem exatamente a mesma função desta outra, usada em algumas distribuições. A única diferença é que neste segundo exemplo é especificado o caminho completo até o arquivo: LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so Em seguida, vem a configuração do módulo. No Debian, a configuração vai no arquivo "/etc/apache2/mods-available/deflate.conf", enquanto do CentOS e no Fedora é usado o arquivo "/etc/httpd/conf.d/httpd-deflate.conf".

Uma configuração simples, e bastante usada, é fazer com que o deflate comprima apenas arquivos em html, texto puro ou xml, sem tentar comprimir outros tipos de arquivos (como imagens ou arquivos diversos disponibilizados para download, que via de regra já estarão compactados). Esta configuração exige uma única linha e é a configuração padrão no Debian:

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml
</IfModule>

» Leia mais: Módulos do Apache e add-ons

  1. 3 Responses to “Módulos do Apache: rewrite e deflate”

  2. Vlw, vou experimentar o deflate… Já li sobre ele há tempos, mas nunca quis tentar devido o uso de CPU.

    By Marcos Elias on ago 20, 2008

  3. No seu caso o problema principal é a memória RAM (imagino que o servidor do VPS tenha bastante CPU livre), então o deflate pode melhorar bastante o desempenho, por causa da questão da liberação mais rápida dos processos :) Isso, imaginando que a principal parcela do tráfego sejam páginas html e não arquivos e imagens.

    By Carlos Morimoto on ago 21, 2008

  4. Teria como verificarmos o ganho e até mesmo se a funcionalidade do deflate está funcionando mesmo, pois apesar de eu tê-la ativada, não sei como verificar, por exemplo, em logs.

    Grato.

    By Rodrigo Morato on ago 22, 2008

Post a Comment