Como habilitar o cache no Apache/Ubuntu Linux?

Como habilitar o cache no Apache/Ubuntu Linux?

Eu tenho um arquivo XML grande (vários megabytes) que é atualizado com bastante frequência (a cada 10 minutos ou menos) e recebe muito tráfego. Gostaria de implementar algum cache para reduzir a largura de banda e a carga do servidor. Olhando os documentos do Apache, vejo uma variedade estonteante de opções de configuração que envolvem várias combinações de mod_expires, mod_headers e mod_cache (e variantes). Acabo andando em círculos e os resultados não são os esperados.

Sinto-me confortável em editar os vários arquivos de configuração se tiver alguma ideia do que devo alterar. Mas no momento estou fuçando no escuro e isso nunca é uma sensação confortável. Então, talvez se eu descrever o que quero, alguém aqui possa me pegar pela mão e dizer: “É isso que você precisa fazer”.

Periodicamente, este arquivo, denominado "stuff.xml", é atualizado e uma nova versão copiada para o diretório. A URL externa seria, por exemplo,http://example.com/stuff.xml. Entenda, esta parte funciona. Sempre que solicito o arquivo, obtenho o resultado esperado. Mas o arquivo é grande e quero economizar largura de banda, então primeiro gostaria de implementar a semântica GET condicional com o cabeçalho If-Modified-Since. Como eu faço isso? Habilitei mod_headers e mod_expired e adicionei a <FilesMatching>seção em meu httpd.conf conforme recomendado em inúmeros exemplos que vi online, mas isso não mudou o comportamento quando fiz uma solicitação GET condicional. Sempre recebo o status 200 com o documento inteiro. Então, como diabos eu implemento isso?

Isso reduzirá transferências desnecessárias. Também gostaria de limitar a quantidade de dados transferidos. Visto que se trata de XML, compactá-lo deve economizar 50% ou mais. Meu próximo passo seria compactar o arquivo de alguma forma e, se não for muito difícil, armazená-lo na memória. Isso reduzirá a transferência de dados por acesso e também reduzirá as transferências de disco. Então, como faço para implementar esse tipo de cache?

Desde já, obrigado.

Responder1

Eu configurei o cache usandomod_expira, dentro da definição <VirtualHost>

ExpiresActive on
ExpiresByType text/xml "modified plus 5 minutes"   

Você pode configurar a compactação usandomod_deflate

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/xml 

Responder2

Quanto ao motivo pelo qual If-Modified-Since não funciona, acho que você deveria postar as partes relevantes de sua configuração (presumo que você tenha reiniciado o Apache). Você também pode analisar rapidamente os logs para ver se o mesmo IP (possivelmente o mesmo usuário) obtém esse arquivo XML várias vezes. Se for sempre ou principalmente novos usuários a cada vez, o cache do lado do cliente não ajudará a reduzir a carga no seu servidor.

Para a compactação, você deseja examinarmod_deflate e/ou mod_gzip. Aquié uma comparação mais antiga do Linux Journal.

Para o cache de memória, acho que se for acessado o suficiente, vale a pena armazenar em cache, o sistema operacional provavelmente já o está armazenando em cache. Se você não tiver problemas de E/S ou latência ruim no arquivo, eu confiaria no sistema operacional para fazer seu trabalho.

informação relacionada