65

我正在使用 Vagrant 运行带有 Apache2 的 Ubuntu 驱动的 VirtualBox。

网络服务器等服务于我的 /vagrant 目录中的静态文件。

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

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

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

4

6 回答 6

133

在这里找到答案:

杰西,

您所看到的可能是因为提供静态文件的服务器正在使用“sendfile()”系统调用,该系统调用被 VirtualBox 文件系统破坏。您需要在服务器中禁用 sendfile() 使用。对于阿帕奇:

启用发送文件关闭

对于 nginx:sendfile off;

最好的,米切尔

于 2012-02-28T10:22:47.630 回答
8

这一直让我发疯!感谢您发布此菲利普。对于那些不知道如何更改配置文件的人,这是我所做的:

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

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

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

将包含的行更改sendfile on;sendfile off;

不要忘记exitvagrant reload

于 2015-10-08T17:20:51.627 回答
6

这是 VirtualBox 中的旧错误(请参阅:#819#9069#12597#14920),其中 vboxvfs 似乎对同步文件的映射访问存在一些问题。

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

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

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

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

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

sendfile off;

其他解决方法是记住不要编辑主机上的文件,或者尝试在 VM 内重新编辑相同的文件。


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

echo 1 > /proc/sys/vm/drop_caches

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

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

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


可以通过以下 mmap-test 程序复制上述问题,请参阅:mmap-problem.c.

于 2016-05-09T15:17:41.223 回答
4

我在 VirtualBox/Docker/Nginx 环境中遇到了类似的问题。

放弃 Linux 页面缓存的决定echo 1 > /proc/sys/vm/drop_caches效果很好,但看起来很尴尬。

sendfile off;中的指令nginx.conf也没有解决问题,我尝试将它与expires off;指令一起使用,它成功了。

所以,我的决定看起来像

sendfile off;
expires off;
于 2016-12-29T13:24:35.573 回答
3

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

我已经在 browserSync 上与我们的朋友一起标记了它,他们做得很棒。因此,与其说是解决方案,不如说是一个原因,与其花几个小时试图修复它,不如先测试一下这是否是您的问题,然后再浪费时间。

这个问题也和本文发现的错误类似

于 2015-10-11T03:10:22.947 回答
0

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

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

于 2016-03-09T23:24:13.173 回答