Desativar cache ao servir arquivos estáticos com Nginx (para desenvolvimento)

88

Estamos usando o Nginx para fornecer arquivos estáticos em uma plataforma de desenvolvimento. Como é uma plataforma de desenvolvimento, gostaríamos de desabilitar o cache para que cada alteração seja propagada para o servidor. A configuração do VHost é bem simples:

server {
  server_name  static.server.local;
  root /var/www/static;

  ## Default location
  location / {
    access_log        off;
    expires           0;
    add_header        Cache-Control private;
  } 
}

Quando acessamos um arquivo HTML ( link ), não temos nenhum problema: o servidor retorna um código 304 Não Modificado enquanto o arquivo não for alterado e uma resposta 200 OK com o arquivo modificado quando o arquivo é alterado.
No entanto, parece se comportar de maneira diferente com um arquivo Javascript ou CSS. Depois que o arquivo é alterado, obtemos uma resposta 200 OK conforme o esperado, mas com o texto antigo.
Existe um mecanismo de cache interno no Nginx que poderia explicar esse comportamento? Ou alguma configuração que devemos adicionar?

Como uma nota lateral, aqui está o cabeçalho retornado pelo Nginx quando o arquivo foi modificado (parece correto):

Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54

Editar
Depois de tentar configurações diferentes com a diretiva expires e Cache-Control , fiz algumas investigações adicionais. Na verdade, o servidor é instalado em um convidado do VirtualBox Ubuntu, e os dados são lidos a partir de uma pasta compartilhada que está no host do Mac OSX.
Se o arquivo for editado de um IDE (NetBeans) no host, parece que as alterações não aparecem, ao passo que, se eu editá-lo diretamente no convidado (usando VIM), ele será atualizado.
O estranho é que ele não se comporta de maneira semelhante com arquivos HTML.
Bastante intrigante.

Editar 2 (RESPONDER)
De fato, a origem do problema estava mais no lado do VirtualBox. Ou melhor, um conflito entre o VirtualBox e a opção "sendfile" do servidor.
Este link VirtualBox Hates Sendfile me deu a solução: troque o sendfile sinalizador na configuração do servidor para off :

sendfile  off;

Espero que isso também possa ajudar outra pessoa usando o VirtualBox para desenvolvimento. :)
Há algumas informações adicionais no fórum do VirtualBox .

    
por Olivier Chappe 13.05.2011 / 14:18

5 respostas

58

Como a resposta está de alguma forma oculta na pergunta - aqui está a solução para o nginx em um ambiente do VirtualBox como resposta independente.

Na configuração do nginx (usally /etc/nginx/nginx.conf) ou no arquivo de configuração do vhost, altere o parâmetro sendfile para off :

sendfile  off;

Embora o sendfile esteja no centro da fama do Nginx (eficiência estática de arquivos de baixo nível extremamente rápida), pode ser uma ruína para o desenvolvimento local, por exemplo, Javascripts que mudam frequentemente e precisam ser recarregados. No entanto, o sendfile do Nginx é inteligente e provavelmente não é o problema da maioria das pessoas; verifique também as opções "desativar cache" do seu navegador!

    
por 19.11.2014 / 09:52
15

defina sua tag de expiração para

expires off;

e ele não deve definir nenhum cabeçalho de expiração, também pode ser o cache do seu navegador incorretamente

    
por 13.05.2011 / 14:20
2

Se nada mencionado acima ajudar e ainda o Nginx retornar o conteúdo antigo de seus arquivos, pode haver um problema relacionado a open_file_cache .

Veja como referência:

por 14.10.2015 / 20:38
2

Este é um bug antigo no VirtualBox (veja: # 819 , #9069 , # 12597 , #14920 ) onde o vboxvfs parece ter alguns problemas com o acesso mmap a arquivos que são sincronizados.

Isso pode acontecer quando você edita o arquivo fora da VM e espera ver a mesma alteração na VM.

Para solucionar esse problema, é necessário desativar o suporte ao sendfile do kernel para entregar arquivos ao cliente desativando EnableSendfile option . Isso é especialmente problemático para arquivos montados em NFS ou SMB.

Por Nginx (alteração em nginx.conf ), por exemplo

sendfile off;

Semelhante ao Apache (em httpd.conf ou no arquivo vhosts), por exemplo,

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>

Após a mudança, recarregue o Apache.

Outra possível solução é apenas lembrar de não editar os arquivos no host ou tentar editar novamente o mesmo arquivo, mas dentro da VM.

Outra solução alternativa inclui descartar o pagecache do Linux, por exemplo

echo 1 > /proc/sys/vm/drop_caches

Ou para limpar os caches a cada segundo (conforme esta postagem ), tente:

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)

Observação: o número 1 significa liberar pagecache, 2 para dentries e inodes, 3 para pagecache, dentries e inodes.

O problema acima pode ser replicado pelo seguinte programa de teste mmap, veja: mmap-problem.c .

    
por 13.12.2016 / 14:03
1

Isso está atrasado, mas ainda está marcado sem resposta, então vou dar uma facada. Apenas por risos, você já tentou:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

Não tentei isso sozinho, mas aprendi a experimentar esse tipo de coisa com o Nginx em um contêiner de servidor de tempos em tempos quando tenho problemas semelhantes a este ...

    
por 28.12.2011 / 01:47