2012-02-28 51 views
61

我使用Vagrant以Apache2运行Ubuntu供电的VirtualBox。流浪汉/ VirtualBox/Apache2奇怪的缓存行为

网络服务器等提供来自我的/ vagrant目录的静态文件。

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

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

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

+1

我有同样的问题,但有一个文本(JSON)文件。我只能做一个足够具体的搜索,找到这个答案我想Nginx的,发现它有同样的问题,因为阿帕奇之后。 – 2013-10-11 10:49:08

回答

132

找到了答案here

JC,

你看到的可能是因为服务于静态文件 服务器使用“的sendfile()”系统调用,这是与碎VirtualBox文件 系统。您需要在您的服务器中禁用sendfile()用法。对于Apache:

EnableSendfile关闭

而对于nginx的: 的sendfile关闭;

最佳, 米切尔

+3

寻找这个特殊问题的解释,我发现你的答案。也是很好的注意,如果你可以使用NFS共享文件,这是一个更可靠和更快的解决方案,而不会从该特定问题的困扰:http://vagrantup.com/v1/docs/nfs.html – Gerry 2012-08-23 11:35:56

+17

哦我的天哪,非常感谢你发布这个。我一直在试图将这只牦牛剃光一整天。 :D – 2013-10-11 10:49:34

+4

非常感谢你。我想要回到我生命中的最后4个小时。 – Deinumite 2013-12-18 20:49:58

8

这已经快把我逼疯了!感谢您发布这个Philipp。 对于那些你们谁不知道该怎么做更改配置文件,这里是我做过什么:

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

煤矿在这里:./etc/nginx/nginx.conf

于是我就这样对其进行修改:$ sudo nano ./etc/nginx/nginx.conf

更改包含sendfile on;sendfile off;

不要忘了0123线和vagrant reload

+0

更改sendfile时有一个错字。它应该被关闭,对吧? – user49438 2015-10-26 18:47:00

+0

是的,你是对的。 – Kenzo 2015-10-28 18:41:02

3

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

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

这个问题也是类似the errors found in this article

0

这也是负责关于一个CentOS/VirtualBox的设置CSS文件奇怪的行为。

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

4

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

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

要解决此问题,您需要禁用内核发送文件支持,以便通过禁用EnableSendfile option(在httpd.conf或vhosts文件中禁用)来将文件传递到客户端。

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

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

Similar for Nginx(在nginx.conf中),例如,

sendfile off; 

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


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

echo 1 > /proc/sys/vm/drop_caches 

或清除缓存每秒(按this post),尝试:

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

注:号码的释放页缓存,2目录项和inode,3页缓存,目录项1个代表和inodes。


上述问题可以通过以下MMAP测试程序被复制,见:mmap-problem.c

+1

可以确认'echo 1>/proc/sys/vm/drop_caches'修复了Vagrant/VirtualBox设置中的问题。这似乎是一个已知的问题:https://www.virtualbox.org/ticket/9069至少它只有六岁。 – jevon 2017-01-09 12:48:53

4

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

关于丢弃Linux pagecache echo 1 > /proc/sys/vm/drop_caches的决定正常,但看起来很尴尬。

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

所以,我的决定看起来像

sendfile off; 
expires off;