Vagrant/VirtualBox/Apache2奇怪的缓存行为

Phi*_*ess 64 virtualbox apache2 vagrant

我正在使用Vagrant在Apache2上运行一个支持Ubuntu的VirtualBox.

除其他外,Web服务器提供来自my/vagrant目录的静态文件.

这在大多数情况下效果很好.但是,当我更改共享文件夹上的图像并重新加载网站时,会提供先前版本的图像,但它会被截断.

如果我先从共享文件夹中删除旧图片,刷新网站以便图片不显示,然后保存新文件并重新加载网站,它就可以工作.

有谁知道这个问题?我没有安装任何特殊功能,只有带有mod_rewrite的Apache 2和带有Mongo的AP,APC插件,MongoDB以及带有一堆脚本的nodeJS.

Phi*_*ess 133

这里找到答案:

JC,

您所看到的可能是因为服务于静态文件的服务器正在使用"sendfile()"系统调用,该系统被VirtualBox文件系统破坏.您需要在服务器中禁用sendfile()用法.对于Apache:

EnableSendfile关闭

对于nginx:sendfile off;

最好,米切尔

  • 哦,我的天哪,非常感谢你发布这个.我一直想把这只牦牛刮一整天.:d (17认同)
  • 非常感谢你做的这些.我希望我生命的最后4个小时回来. (4认同)
  • 寻找这个特殊问题的解释,我找到了答案.另外值得注意的是,如果您可以使用NFS共享文件,那么它是一个更可靠,更快速的解决方案,并且不会遇到这个特殊问题:http://vagrantup.com/v1/docs/nfs.html (3认同)
  • @NathanLong为"剃这个牦牛"+1 (3认同)
  • 非常感谢你做的这些. (2认同)

Ken*_*nzo 8

这让我疯了!感谢发布这个Philipp.对于那些不知道如何更改配置文件的人,这是我做的:

要查找文件: $ sudo find -name "nginx.conf"

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

所以我运行它来修改它: $ sudo nano ./etc/nginx/nginx.conf

更改包含行sendfile on;sendfile off;

别忘了exitvagrant reload!


ken*_*orb 6

这是VirtualBox中的旧错误(参见:#819,#9069,#12597,#14920),其中vboxvfs似乎在对同步文件的mmapped访问方面存在一些问题.

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

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

<Directory "/path-to-nfs-files">
  EnableSendfile Off
</Directory>
Run Code Online (Sandbox Code Playgroud)

对于NFS或SMB安装的文件,这尤其麻烦.更改后重新加载Apache.

类似于Nginx(in nginx.conf),例如

sendfile off;
Run Code Online (Sandbox Code Playgroud)

其他解决方法是记住不要编辑主机上的文件,或尝试重新编辑同一文件,但要在VM中.


另一种解决方法包括删除Linux pagecache,例如

echo 1 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

或者每秒清除缓存(根据这篇文章),尝试:

watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)
Run Code Online (Sandbox Code Playgroud)

注意:数字1代表释放pagecache,2代表dentries和inode,3代表pagecache,dentries和inode.


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