apache mod_cache na v2.2 - ativar o cache com base no URL

2

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?

    
por Janning 22.06.2012 / 17:21

1 resposta

1

link

The no-cache environment variable can be set to disable caching on a finer grained set of resources in versions 2.2.12 and later.

Portanto, você deve ser capaz de desativar o cache em tudo que não seja solicitações terminadas em .png com

SetEnvIf Request_URI !\.png$ no-cache

    
por 03.07.2012 / 17:40