Tive problemas para fazer o disk_cache funcionar e não consegui entender o porquê. Esta foi a seção relevante da minha configuração
# Caching
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
Eu estava cronometrando uma solicitação como a seguinte, mas o cache parecia não ter efeito, já que a resposta consumia 7 segundos, não importa o que acontecesse.
time curl -k https://customer1.myhosts.com/appserver/slow_request?param1=fooBar
Depois de ativar o log de depuração, encontrei a seguinte instrução nos logs, explicando por que nenhum cache estava sendo feito:
[Sexta-feira, 24 de agosto 17:22:01 2012] [depuração] mod_cache.c (552): cache: não armazenado em cache. Motivo: string de consulta presente, mas sem tempo de expiração explícito
Acontece que isso é mencionado no Guia de cache do Apache:
Se o URL incluir uma string de consulta (por exemplo, de um método GET de formulário HTML), ele não será armazenado em cache, a menos que a resposta especifique uma expiração explícita, incluindo um cabeçalho "Expires:" ou a diretiva max-age ou s-maxage do "Cache -Control:" cabeçalho, conforme seções 13.9 e 13.2.1 do RFC2616.
OK, então adiciono o seguinte (retirado deEste artigo) no Apache
Header set Cache-Control "max-age=290304000"
Ainda não funciona, desta vez recebo a mensagem
"... não armazenado em cache. Motivo: nenhum cabeçalho Last-Modified, Etag ou Expires"
Agora, esta é uma história diferente. Como posso resolver isso sem mexer no código do servidor de aplicativos?
Responder1
A única maneira de fazer com que o Apache armazenasse em cache as respostas do servidor de aplicativos era adicionando os cabeçalhos solicitados pelo Apache no log às respostas. Acabou sendo muito fácil criar um filtro JAX-RS.
Então, depois de adicionar Last-Modified e um cabeçalho Expires, a única coisa necessária foram as duas linhas a seguir na minha configuração do Apache.
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
Responder2
igual a
Cache-Control:s-maxage=1200
resolveu esse problema