Vagrant / VirtualBox / Apache2奇怪的caching行为

我正在使用Vagrant以Apache2运行Ubuntu提供的VirtualBox。

networking服务器等,从我/ vagrant目录中提供静态文件。

这在大多数情况下运作良好。 但是,当我更改共享文件夹中的图像并重新加载网站时,图像的先前版本将被提供,但会被截断。

如果我先从我的共享文件夹中删除旧图片,则刷新网站,所以图片不显示,然后保存新文件并重新加载网站。

有人知道这个问题吗? 我没有什么特别的安装,只有Apache 2与mod_rewrite和PHP与Mongo,APC插件,MongoDB以及nodeJS与一堆脚本。

在这里find答案:

JC,

你所看到的可能是因为服务于静态文件的服务器正在使用“sendfile()”系统调用,它与VirtualBox文件系统一起被破坏了。 您需要在服务器中禁用sendfile()用法。 对于Apache:

EnableSendfileclosures

而对于nginx:sendfileclosures;

最好的,米切尔

这一直让我疯狂! 感谢张贴这个菲利普。 对于那些不知道如何改变configuration文件的人,这是我做的:

find这个文件: $ sudo find -name "nginx.conf"

我在这里: ./etc/nginx/nginx.conf

所以我跑了这个修改: $ sudo nano ./etc/nginx/nginx.conf

更改包含sendfile on;的行sendfile on; 发送文件sendfile off;

不要忘记exitvagrant reload

这是VirtualBox中的旧bug(请参阅: #819 , #9069 , #12597 , #14920 ),其中vboxvfs似乎在对同步文件进行mmapped访问时存在一些问题。

当您在VM之外编辑文件时,可能会发生这种情况,并且您希望在VM中看到相同的更改。

要解决这个问题,您需要禁用内核sendfile支持,通过在httpd.conf或vhosts文件中禁用EnableSendfile选项来将文件传递到客户端,例如

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

这对NFS或SMB挂载文件尤其麻烦。 更改后重新加载Apache。

Nginx类似 (在nginx.conf ),例如

 sendfile off; 

其他解决方法是记住不要编辑主机上的文件,或尝试重新编辑同一个文件,但在虚拟机内。


另一个解决方法包括删除Linux页面caching,例如

 echo 1 > /proc/sys/vm/drop_caches 

或者每秒清除caching(按照这篇文章 ),请尝试:

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

注意:编号1代表释放页面caching,代表2个用于deniser和inode,3代表页caching,dentries和inode。


上面的问题可以通过下面的mmap-test程序来复制,参见: mmap-problem.c

对于任何人通过gulp.watch使用Laravel 5,Barryvdh的Debugbar和browserSync,你可能会得到这个错误。 由于浏览器同步代理我的请求,我有完全相同的错误。 如果我通过查看我的开发服务器: http : //127.0.0.1 : 3000/laravel/page我得到错误http://127.0.0.1/laravel/page错误消失。;

我已经在browserSync上与我们的朋友举报,他们做了一个很棒的工作。 因此,这不仅仅是一个解决scheme的原因,而是花费数小时来解决问题,在浪费更多时间之前testing这是否是您的问题。

这个问题也与本文中的错误类似

我有VirtualBox / Docker / Nginx环境类似的问题。

删除Linux pagecache echo 1 > /proc/sys/vm/drop_caches工作正常,但看起来很尴尬。

还指令sendfile off;nginx.conf中没有解决问题,我试图使用它expires off; 指示一起,它是成功的。

所以,我的决定看起来像

 sendfile off; expires off; 

这也是CentOS / VirtualBox设置中CSS文件奇怪的行为的原因。

您可以更改/ vagrant文​​件夹中的CSS文件的内容,浏览器将显示状态200(而不是304),这意味着它知道该文件是新的。 但内容不会改变。