【问题标题】:Vagrant/VirtualBox/Apache2 Strange Cache BehaviourVagrant/VirtualBox/Apache2 奇怪的缓存行为
【发布时间】:2012-03-17 18:11:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我遇到了同样的问题,但使用的是文本 (json) 文件。在我尝试了 Nginx 并发现它与 Apache 存在相同的问题后,我只能进行足够具体的搜索才能找到这个答案。

标签: apache2 virtualbox vagrant


【解决方案1】:

找到答案here

JC,

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

启用发送文件关闭

对于 nginx: 发送文件关闭;

最好, 米切尔

【讨论】:

  • 寻找这个特殊问题的解释,我找到了你的答案。还需要注意的是,如果您可以使用 NFS 共享文件,这是一种更可靠、更快速的解决方案,并且不会遇到这个特殊问题:vagrantup.com/v1/docs/nfs.html
  • 天哪,非常感谢您发布此消息。我一整天都想给这只牦牛剃毛。 :D
  • 非常感谢您。我想要我生命的最后 4 小时。
  • 非常感谢。
  • @NathanLong +1 为“给这只牦牛剃毛”
【解决方案2】:

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

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

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

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

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

别忘了exitvagrant reload

【讨论】:

  • 修改sendfile 有错别字。应该关了吧?
【解决方案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类似

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      当您在 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;
      

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


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

      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

      【讨论】:

      • 可以确认echo 1 &gt; /proc/sys/vm/drop_caches 修复了 Vagrant/VirtualBox 设置的问题。这似乎是一个已知问题:virtualbox.org/ticket/9069 至少它只有六岁。
      【解决方案6】:

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

      删除 Linux 页面缓存 echo 1 &gt; /proc/sys/vm/drop_caches 的决定效果很好,但看起来很尴尬。

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

      所以,我的决定看起来像

      sendfile off;
      expires off;
      

      【讨论】:

        猜你喜欢
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2019-07-19
        • 2011-03-29
        相关资源
        最近更新 更多