Como evito que o lighttpd armazene em cache arquivos estáticos, mesmo quando modificados no disco?


10

Estou usando o lighttpd para servir arquivos estáticos. Eu tenho um monte de imagens em um diretório que eu atualizo regularmente. Isso mudará o conteúdo do arquivo (e o tamanho do arquivo), bem como a data da modificação, mas não o nome do arquivo.

Quando acesso os arquivos por meio de http, as atualizações não são levadas em consideração e o lighty serve o arquivo antigo. Posso renomear manualmente o arquivo para algo diferente, o lighttpd retornará um erro 404 e, se eu renomear meu arquivo novamente, obterá a versão atualizada correta. Parece que o lightty está usando algum tipo de mecanismo de cache próprio (o que é bom) para retornar arquivos estáticos. Infelizmente, parece que esse mecanismo não se atualiza quando os arquivos são modificados.

Eu verifiquei o Wireshark e meu navegador está realmente fazendo uma solicitação para o arquivo, não é um problema de cache do navegador. Ele retorna 200 OK ao solicitá-lo de um cache vazio e 304 304 não modificado de outra forma, conforme o esperado. Mas o arquivo é retornado com um cabeçalho Last-Modified errado que não reflete a data real da última modificação.

Talvez haja alguma diretiva de configuração que eu não conheça?

Gostaria que os arquivos retornados pelo lighty refletissem diretamente as alterações feitas no disco ou, pelo menos, pudessem invalidar seu cache.

Atualização para quem segue esta pergunta: Encontrei um culpado. Se eu atualizar um arquivo estático, o Lighty não retornará o novo conteúdo, mas o novo Comprimento de Conteúdo em seus cabeçalhos, resultando em lixo exibido. Se eu compactar o arquivo usando mod_compress, o problema desaparecerá, pois o mod_compress usa seu próprio sistema de cache. Infelizmente, não consigo compactar todos os arquivos (arquivos de imagem, por exemplo). Portanto, é apenas uma correção parcial, mas voltarei a ela mais tarde e encontrarei uma solução.

Respostas:


6

Finalmente encontrei o problema. E vem do VirtualBox.

Ao editar um arquivo no Host (Win), o lighttpd no convidado (Linux) não atualiza corretamente o conteúdo do arquivo (mas atualiza corretamente o tamanho do arquivo), retornando, assim, o conteúdo cortado ou ilegível.

Desmontar minhas unidades compartilhadas e remontá-las ou editar arquivos diretamente no convidado, corrigiu o problema.

Levei 6 meses para finalmente descobrir isso.


3

Você não menciona se possui o mod_cache instalado ou não? O padrão deste módulo é 'ativado' quando instalado.

Sou aversão a sugeri-lo, mas ativar o Etags ajuda?


mod_cache não está instalado. ETags estão ativados (mas o inode não é usado para gerar o ETag). Tentei ativar o inode ou desativar o ETag, mas sem sucesso.
Pixelastic

2

Tente definir o cache do mecanismo de estatísticas como 'desativado':

server.stat-cache-engine = "disable'

Obrigado, mas isso não tem efeito. No entanto, eu não conhecia essa diretiva e poderia ser útil mais tarde.
precisa saber é o seguinte

Pode haver um proxy intermediário entre você e o servidor? Tente reiniciar o servidor e acessar o mesmo arquivo. Você está usando mod_compress?
Aleksey Korzun

Estou executando uma VM do Ubuntu em um host do Windows 7. Lighty está na VM. Eu não acho que possa haver um problema de proxy aqui. Eu reiniciei o servidor, mas isso não limpa o cache poderoso. Estou usando o mod_compress, mas não nesses arquivos. Vou tentar reiniciar a VM inteira e desativar o mod_compress para ver se isso muda alguma coisa. Obrigado pelas idéias.
Pixelastic

Hmm, eu posso ter algo aqui. Se eu mudar o arquivo para um menor (mas mantendo o mesmo nome), obtive apenas a metade superior do meu arquivo. Parece que o arquivo antigo é exibido com o comprimento do conteúdo do atual. Se eu substituir por um arquivo maior, o arquivo inteiro (antigo) será exibido. Parece que as alterações no tamanho do arquivo são levadas em consideração, mas não o conteúdo do arquivo.
precisa saber é o seguinte

Desculpe por comentários de spam: desabilitar o mod_compress não muda nada, nem a reinicialização de toda a VM.
precisa saber é o seguinte

2

Esta opção lighttpd funcionou para mim

server.network-backend = "writev" 

Funcionou como um encanto para mim, em uma VM Debian em uma área de trabalho Debian, obrigado!
Yvan

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.