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;
不要忘记exit
和vagrant 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),这意味着它知道该文件是新的。 但内容不会改变。