Estamos usando o apache2.2 como um servidor front-end com servidores de aplicativos como proxies reversos atrás do apache.
Estamos usando mod_cache
para algumas imagens e ativamos assim:
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_disk_cache
CacheIgnoreCacheControl On
CacheMaxFileSize 2500000
CacheIgnoreURLSessionIdentifiers jsessionid
CacheIgnoreHeaders Set-Cookie
</IfModule>
Os URLs de imagem variam completamente e não têm padrão de início comum, mas todos terminam em ".png". Por isso usamos a raiz em CacheEnable /
Se não for exibido a partir do cache, a solicitação será encaminhada para um servidor de aplicativos por meio do proxy reverso. Até aí tudo bem, o cache está funcionando bem.
Mas eu realmente só preciso armazenar em cache todas as solicitações de imagens terminadas em ".png". Minha configuração acima ainda funciona como o meu servidor de aplicativos envia um cabeçalho Cache-Control: no-cache apropriado no caminho de volta para o apache. Assim, a maioria das páginas envia um cabeçalho sem cache e elas não são armazenadas em cache. Minhas respostas ".png" não enviam um cabeçalho Cache-Control, então o apache só vai armazenar todos os URLs com ".png". Bem.
Mas quando uma nova requisição entra no apache, o apache não sabe que apenas solicitações .png devem ser consideradas, então cada requisição está verificando um arquivo no disco (gravado com strace -e trace=file -p pid
):
[pid 19063] open("/var/cache/apache2/mod_disk_cache/zK/q8/Kd/g6OIv@woJRC_ba_A.header", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
Não quero que o apache vá para o disco a cada solicitação, pois a maioria das solicitações não é armazenada em cache. E temos até 10.000 solicitações / s no horário de pico. Às vezes nossa leitura de IO espera picos. Não está ficando muito lento, mas tentamos ajustá-lo para um melhor desempenho.
No apache 2.4 você pode dizer:
<LocationMatch .png$>
CacheEnable disk
</LocationMatch>
Isso não é possível no 2.2 e como não vejo backports para o debian, não irei atualizar.
Então eu tentei ajustar o apache2.2 para seguir minhas regras:
<IfModule mod_disk_cache.c>
SetEnvIf Request_URI "\.png$" image
RequestHeader unset Cache-Control
RequestHeader append Cache-Control no-cache env=!image
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_disk_cache
#CacheIgnoreCacheControl on
CacheMaxFileSize 2500000
CacheIgnoreURLSessionIdentifiers jsessionid
CacheIgnoreHeaders Set-Cookie
</IfModule>
A idéia é permitir que o apache decida atender a solicitação do cache com base no cabeçalho do Cache-control (o padrão CacheIgnoreCacheControl é off). E antes, basta definir um RequestHeader com base na solicitação. Se não for uma solicitação de imagem, defina um cabeçalho de controle de cache, portanto, ele deve ignorar o cache.
Isso não funciona, acho que devido ao processamento tardio da diretiva RequestHeader, consulte o link
Não é possível adicionar processamento antecipado, pois a palavra-chave "inicial" não pode ser usada em conjunto com uma condicional "env =! image"
Não consigo alterar o URL solicitando as imagens e sei que existem outras soluções. Mas estou interessado apenas em configurar o apache2.2 para alcançar meu objetivo.
Alguém tem uma ideia de como alcançar meu objetivo?