我使用Vagrant使用Apache2运行基于Ubuntu的VirtualBox。
除其他外,网络服务器提供来自我/ vagrant目录的静态文件。
这在大多数情况下效果很好。但是当我更改共享文件夹上的图像并重新加载网站时,会提供先前版本的图像,但它会被截断。
如果我首先从共享文件夹中删除旧图片,刷新网站以便不显示图片,然后保存新文件并重新加载网站,这是有效的。
有人知道这个问题吗?我没有安装任何特殊功能,只有带有mod_rewrite的Apache 2和带有Mongo的AP,APC插件,MongoDB以及带有一堆脚本的nodeJS。
答案 0 :(得分:133)
找到答案here:
JC,
您所看到的可能是因为服务器提供静态文件 正在使用“sendfile()”系统调用,它被VirtualBox文件破坏 系统。您需要在服务器中禁用sendfile()用法。对于Apache:
关闭EnableSendfile
对于nginx: sendfile off;
最佳, 米切尔
答案 1 :(得分:8)
这让我发疯了!感谢发布这个Philipp。 对于那些不知道如何更改配置文件的人,我就是这样做的:
要查找文件:$ sudo find -name "nginx.conf"
我在这里:./etc/nginx/nginx.conf
所以我运行它来修改它:$ sudo nano ./etc/nginx/nginx.conf
将包含sendfile on;
的行更改为sendfile off;
别忘了exit
和vagrant reload
!
答案 2 :(得分:6)
这是VirtualBox中的旧错误(请参阅:#819,#9069,#12597,#14920)其中vboxvfs似乎在对文件进行mmapped访问方面存在一些问题同步。
当您在VM外部编辑文件时,可能会发生这种情况,并且您希望在VM中看到相同的更改。
要解决此问题,您需要通过在httpd.conf
或vhosts文件中禁用EnableSendfile
option来禁用内核sendfile支持以将文件传送到客户端,例如
<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
对于NFS或SMB安装的文件,这尤其麻烦。更改后重新加载Apache。
Similar for Nginx
(在nginx.conf
中),例如
sendfile off;
其他解决方法是记住不要编辑主机上的文件,或尝试重新编辑同一文件,但要在VM中。
另一种解决方法包括删除Linux pagecache,例如
echo 1 > /proc/sys/vm/drop_caches
或者每秒清除一次缓存(根据this post),请尝试:
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
。
答案 3 :(得分:4)
我在VirtualBox / Docker / Nginx环境中遇到了类似的问题。
删除Linux pagecache echo 1 > /proc/sys/vm/drop_caches
的决定运行正常,但看起来很尴尬。
sendfile off;
中的指令nginx.conf
也没有解决问题,我尝试将它与expires off;
指令一起使用,并且成功了。
所以,我的决定看起来像是
sendfile off;
expires off;
答案 4 :(得分:3)
对于使用Laravel 5,Barryvdh的Debugbar和browserSync via gulp.watch的任何人,您可能会收到此错误。我有完全相同的错误,因为浏览器同步代理了我的请求。 如果我通过以下方式查看我的开发服 http://127.0.0.1:3000/laravel/page我收到了错误 http://127.0.0.1/laravel/page错误消失了。
我在浏览器同步中与我们的朋友进行了标记,他们做了很棒的工作。所以,这不是解决问题的理由,而是花费数小时试图修复它,在浪费更多时间之前测试一下这是否是你的问题。
类似答案 5 :(得分:0)
这也是CentOS / VirtualBox设置中有关CSS文件的奇怪行为的原因。
您可以更改/ vagrant文件夹中CSS文件的内容,浏览器将显示状态200(而不是304),这意味着它知道该文件是新的。但内容不会改变。