Cache Apache · 6 min read · Dec 28, 2025
Cache com o mod_cache do Apache no Debian Lenny
Cache com o mod_cache do Apache no Debian Lenny
Versão 1.0
Autor: Falko Timme
Siga-me no Twitter
Este artigo explica como você pode armazenar em cache o conteúdo do seu site com o mod_cache do Apache no Debian Lenny. Se você tem um site dinâmico de alto tráfego que gera muitas consultas ao banco de dados a cada solicitação, você pode diminuir a carga do servidor dramaticamente armazenando em cache seu conteúdo por alguns minutos ou mais (isso depende de quão frequentemente você atualiza seu conteúdo).
Não dou nenhuma garantia de que isso funcionará para você!
1 Nota Preliminar
Estou assumindo que você tem uma configuração funcional do Apache2 (Apache 2.2.x - antes dessa versão, o mod_cache é considerado experimental) dos repositórios do Debian - a versão do Apache nos repositórios do Debian Lenny é 2.2.9, então você deve estar pronto para começar.
Estou usando o diretório raiz /var/www aqui para meu vhost de teste - você deve ajustar isso se seu diretório raiz for diferente.
2 Habilitando o mod_cache
O mod_cache tem dois submódulos que gerenciam o armazenamento em cache, mod_disk_cache (para armazenar conteúdos no disco rígido) e mod_mem_cache (para armazenar conteúdos na memória, que é mais rápido do que o cache em disco). Decida qual você deseja usar e continue com o capítulo 2.1 (mod_disk_cache) ou 2.2 (mod_mem_cache).
2.1 mod_disk_cache
A configuração do mod_disk_cache é armazenada em /etc/apache2/mods-available/disk_cache.conf, então vamos editar esse arquivo:
vi /etc/apache2/mods-available/disk_cache.confCertifique-se de descomentar a linha CacheEnable disk /, para que a configuração mínima fique assim:
| |
Você pode encontrar explicações para essas opções de configuração e outras opções de configuração em http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.
Agora podemos habilitar o mod_cache e o mod_disk_cache:
a2enmod cache
a2enmod disk_cache
/etc/init.d/apache2 restart Para garantir que nosso diretório de cache /var/cache/apache2/mod_disk_cache não se encha com o tempo, precisamos limpá-lo com o comando htcacheclean. Esse comando faz parte do pacote apache2-utils que instalamos da seguinte forma:
aptitude install apache2-utils Depois, podemos iniciar o htcacheclean como um daemon assim:
htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -iIsso limpará nosso diretório de cache a cada 30 minutos e garantirá que ele não fique maior que 100MB. Para saber mais sobre o htcacheclean, dê uma olhada em
man htcachecleanClaro, você não quer iniciar o htcacheclean manualmente toda vez que reiniciar o servidor - portanto, editamos /etc/rc.local…
vi /etc/rc.local… e adicionamos a seguinte linha a ele, logo antes da linha exit 0:
| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |
Isso iniciará o htcacheclean automaticamente toda vez que você iniciar o servidor.
2.2 mod_mem_cache
A configuração do mod_mem_cache está localizada em /etc/apache2/mods-available/mem_cache.conf:
vi /etc/apache2/mods-available/mem_cache.conf | |
Esta é a configuração padrão - se você quiser, pode modificá-la. Uma lista de diretivas de configuração para o mod_mem_cache está disponível aqui: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
Agora vamos habilitar o mod_cache e o mod_mem_cache da seguinte forma:
a2enmod cache
a2enmod mem_cache
/etc/init.d/apache2 restartÉ isso! Com o mod_mem_cache, você não precisa limpar nenhum diretório de cache.
3 Testando
Infelizmente, o mod_cache não fornece nenhuma funcionalidade de registro, o que é ruim se você quiser saber se o registro está funcionando. Portanto, eu crio um pequeno arquivo de teste PHP, /var/www/cachetest.php, que envia cabeçalhos HTTP que informam ao mod_cache que ele deve armazenar o arquivo em cache por 300 segundos, e que simplesmente imprime o timestamp:
vi /var/www/cachetest.php| "; ?> |
Agora chame esse arquivo em um navegador - ele deve exibir o timestamp atual. Em seguida, clique na barra de endereços do navegador e pressione ENTER para que a página seja carregada novamente (não pressione F5 ou o botão de recarregar - isso sempre buscará uma cópia nova do servidor em vez do cache!) - se tudo correr bem, você ainda deve ver o antigo timestamp em cache. Se você esperar 300 segundos, deve obter uma cópia nova do servidor em vez do cache.
4 Cabeçalhos HTTP
O cache não funciona imediatamente - você deve modificar sua aplicação web para que o cache possa funcionar (é possível que sua aplicação web já suporte cache - consulte a documentação da sua aplicação para descobrir). O mod_cache armazenará em cache páginas da web apenas se os cabeçalhos HTTP enviados pela sua aplicação web disserem para fazê-lo.
Aqui estão alguns exemplos de cabeçalhos que dizem ao mod_cache não armazenar em cache:
- Cabeçalhos Expires com uma data no passado: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
- Certos cabeçalhos Cache-Control: “Cache-Control: no-store, no-cache, must-revalidate” ou “Cache-Control: must-revalidate, max-age=0”
- Cabeçalhos Set-Cookie: uma página não será armazenada em cache se um cookie for definido.
Portanto, se você quiser que o mod_cache armazene suas páginas em cache, modifique sua aplicação para não enviar esses cabeçalhos.
Se você quiser que o mod_cache armazene suas páginas em cache, pode definir um cabeçalho Expires com uma data no futuro, mas a maneira recomendada é usar max-age:
"Cache-Control: must-revalidate, max-age=300"Isso diz ao mod_cache para armazenar a página em cache por 300 segundos (max-age) - infelizmente, o mod_cache não conhece a opção s-maxage (veja http://www.mnot.net/cache_docs/#CACHE-CONTROL), por isso devemos usar a opção max-age (que também diz ao seu navegador para armazenar em cache - por favor, tenha isso em mente se você obtiver resultados inesperados!). Se o mod_cache conhecesse a opção s-maxage, poderíamos usar “Cache-Control: must-revalidate, max-age=0, s-maxage=300”, que diria ao mod_cache, mas não ao navegador, para armazenar a página em cache.
Claro, esse cabeçalho é inútil se você enviar um dos cabeçalhos que não armazenam em cache (Expires no passado, Set-Cookie, etc.) ao mesmo tempo!
Outro cabeçalho muito importante para o cache é este:
"Vary: Accept-Encoding"Isso faz com que o mod_cache mantenha duas cópias de cada página em cache, uma comprimida (gzip) e uma descomprimida, para que ele possa entregar a versão correta dependendo das capacidades do user-agent/navegador. Alguns user-agents não entendem a compressão gzip, então eles devem receber a versão descomprimida.
Então aqui está o resumo: use os seguintes dois cabeçalhos se você quiser que o mod_cache armazene em cache:
“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”
e certifique-se de que nenhum Expires com uma data no passado, cookies, etc. sejam enviados.
Se sua aplicação estiver escrita em PHP, você pode usar a função header() do PHP para enviar cabeçalhos HTTP, por exemplo, assim:
header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);
Esta página é uma leitura obrigatória se você quiser aprender mais sobre cabeçalhos HTTP e cache: http://www.mnot.net/cache_docs/
5 Links
- Apache: http://httpd.apache.org/
- mod_cache: http://httpd.apache.org/docs/2.2/mod/mod_cache.html
- mod_disk_cache: http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
- mod_mem_cache: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
- Guia de Cache do Apache: http://httpd.apache.org/docs/2.2/caching.html
- Tutorial de Cache: http://www.mnot.net/cache_docs/
- Debian: http://www.debian.org/
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.