Comportamento estranho do cache do Vagrant/VirtualBox/Apache2
-
13-11-2019 - |
Pergunta
Estou usando o Vagrant para executar um VirtualBox com Ubuntu com Apache2.
O servidor web, entre outros, serve arquivos estáticos do meu diretório /vagrant.
Isso funciona bem na maioria das vezes.Mas quando altero uma imagem na minha pasta compartilhada e recarrego o site, a versão anterior da imagem é veiculada, mas fica truncada.
Funciona se eu excluir primeiro a imagem antiga da minha pasta compartilhada, atualizar o site para que a imagem NÃO seja mostrada, salvar o novo arquivo e recarregar o site novamente.
Alguém sabia desse problema?Não tenho nada de especial instalado, apenas Apache 2 com mod_rewrite e PHP com Mongo, APC Plugin, MongoDB e também nodeJS com vários scripts.
Solução
Encontrei a resposta aqui :
.jc,
O que você está vendo é provavelmente porque o servidor servindo os arquivos estáticos está usando o syscall "sendfile ()", que é quebrado com o arquivo do VirtualBox sistema.Você precisa desativar o uso do SendFile () no seu servidor.Para Apache:
permite OFF OFF
e para nginx: sendfile off;
melhor, Mitchell
Outras dicas
Isso tem me deixado louco!Obrigado por postar isso Philipp.Para aqueles que não têm ideia de como alterar o arquivo de configuração, aqui está o que eu fiz:
Para encontrar o arquivo: $ sudo find -name "nginx.conf"
O meu estava aqui: ./etc/nginx/nginx.conf
Então eu executei isso para modificá-lo: $ sudo nano ./etc/nginx/nginx.conf
Altere a linha que contém sendfile on;
para sendfile off;
Não se esqueça de exit
e vagrant reload
!
Este é um bug antigo no VirtualBox (veja: #819, #9069, #12597, #14920) onde o vboxvfs parece ter alguns problemas com o acesso mapeado aos arquivos que são sincronizados.
Isso pode acontecer quando você edita o arquivo fora da VM e espera ver a mesma alteração dentro da VM.
Para solucionar esse problema, você precisa desabilitar o suporte sendfile do kernel para entregar arquivos ao cliente desabilitando EnableSendfile
opção, seja em httpd.conf
ou no arquivo vhosts, por ex.
<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
Isso é especialmente problemático para arquivos montados em NFS ou SMB.Após a alteração recarregue o Apache.
Semelhante para Nginx
(em nginx.conf
), por exemplo.
sendfile off;
Outra solução alternativa é lembrar de não editar os arquivos no host ou tentar reeditar o mesmo arquivo, mas dentro da VM.
Outra solução alternativa inclui descartar o pagecache do Linux, por ex.
echo 1 > /proc/sys/vm/drop_caches
Ou para limpar os caches a cada segundo (conforme esta postagem), tentar:
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 mmap-test, veja: mmap-problem.c
.
Tenho um problema semelhante com o ambiente VirtualBox/Docker/Nginx.
A decisão de abandonar o pagecache do Linux echo 1 > /proc/sys/vm/drop_caches
funciona bem, mas parece estranho.
Também a directiva sendfile off;
no nginx.conf
não resolveu o problema e tentei usá-lo com expires off;
directiva em conjunto e foi bem sucedida.
Então, minha decisão parece
sendfile off;
expires off;
Para qualquer um usando o Laravel 5, Debugbar Barryvdh e Browsersync Via Gulp.watch, você pode obter este erro.Eu tinha exatamente o mesmo erro por causa de como a sincronização do navegador estava proxiando meu pedido. Se eu vi meu servidor Dev via: http://127.0.0.1:3000/laravel/page Eu recebi o erro http://127.0.0.1/laravel/page erro ido.
Eu sinalizei com nossos amigos no Browsersync, eles fazem um trabalho incrível.Então, é mais uma razão do que uma solução, mas em vez de passar horas tentando corrigi-lo, teste para ver se este é o seu problema antes de desperdiçar mais tempo.
Esta questão também é semelhante a Os erros encontrados neste artigo
Isso também foi responsável pelo comportamento estranho em relação aos arquivos CSS em uma configuração de CentOS / VirtualBox.
Você pode alterar o conteúdo de um arquivo CSS na pasta / VAGRANT, e o navegador mostraria um status de 200 (em vez de um 304), o que significa que sabia que o arquivo era novo.Mas o conteúdo não teria mudado.