Vagrant / VirtualBox / Apache2 Странное поведение кэша - PullRequest
64 голосов
/ 28 февраля 2012

Я использую Vagrant для запуска VirtualBox, работающего на Ubuntu, с Apache2.

Веб-сервер, помимо прочего, обслуживает статические файлы из моего каталога / vagrant.

Это хорошо работает большую частьвремя.Но когда я изменяю изображение в моей общей папке и перезагружаю веб-сайт, предыдущая версия изображения обслуживается, но усекается.

Это работает, если я сначала удаляю старую картинку из общей папки, обновляю веб-сайт, чтобы картинка НЕ ​​отображалась, затем сохраняю новый файл и снова загружаю веб-сайт.

Кто-нибудь зналоб этой проблеме?У меня не установлено ничего особенного, только Apache 2 с mod_rewrite и PHP с Mongo, APC Plugin, MongoDB, а также nodeJS с кучей скриптов.

Ответы [ 6 ]

133 голосов
/ 28 февраля 2012

Нашел ответ здесь :

JC,

Вероятно, вы видите, что сервер, обслуживающий статические файлы использует системный вызов sendfile (), который не работает с файлом VirtualBox система. Вам необходимо отключить использование sendfile () на вашем сервере. Для Apache:

EnableSendfile выключен

А для nginx: sendfile off;

Лучший, Митчелл

8 голосов
/ 08 октября 2015

Это сводит меня с ума! Спасибо за размещение этого Филиппа. Для тех из вас, кто не знает, как изменить файл конфигурации, вот что я сделал:

Чтобы найти файл: $ sudo find -name "nginx.conf"

Мой был здесь: ./etc/nginx/nginx.conf

Итак, я запустил это, чтобы изменить его: $ sudo nano ./etc/nginx/nginx.conf

Изменить строку, содержащую sendfile on; на sendfile off;

Не забудьте exit и vagrant reload!

6 голосов
/ 09 мая 2016

Это старая ошибка в VirtualBox (см .: # 819 , # 9069 , # 12597 , # 14920 ), где vboxvfs Кажется, есть некоторые проблемы с mmapped доступом к файлам, которые синхронизируются.

Это может произойти, когда вы редактируете файл вне виртуальной машины, и вы ожидаете увидеть такое же изменение внутри виртуальной машины.

Чтобы обойти эту проблему, вам необходимо отключить поддержку sendfile ядра для доставки файлов клиенту, отключив параметр EnableSendfile , либо в httpd.conf, либо в файле vhosts, например,

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

Это особенно неприятно для смонтированных файлов NFS или SMB. После изменения перезагрузите Apache.

Аналогично для Nginxnginx.conf), например,

sendfile off;

Другим обходным решением является не редактировать файлы на хосте или пытаться повторно редактировать тот же файл, но внутри ВМ.


Другой обходной путь включает удаление кэша страниц Linux, например,

echo 1 > /proc/sys/vm/drop_caches

Или очищать кеши каждую секунду (согласно этой записи ), попробуйте:

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

Примечание: номер 1 обозначает освобождение кэша страниц, 2 - зубные и иноды, 3 - кэширование страниц, зубные и иноды.


Указанная проблема может быть воспроизведена следующей программой mmap-test, см. mmap-problem.c.

4 голосов
/ 29 декабря 2016

У меня похожая проблема со средой VirtualBox / Docker / Nginx.

Решение об удалении Linux PageCache echo 1 > /proc/sys/vm/drop_caches работает отлично, но выглядит неловко.

Также директива sendfile off; в nginx.conf не решила проблему, и я попытался использовать ее вместе с директивой expires off;, и она прошла успешно.

Итак, мое решение выглядит как

sendfile off;
expires off;
3 голосов
/ 11 октября 2015

Для тех, кто использует Laravel 5, Debugbar Barryvdh и browserSync через gulp.watch, вы можете получить эту ошибку.У меня была точно такая же ошибка из-за того, как браузер Sync передавал мой запрос.Если я смотрел на свой dev-сервер через: http://127.0.0.1:3000/laravel/page Я получил ошибку http://127.0.0.1/laravel/page Ошибка исчезла.

Я пометил его с нашими друзьями в browserSync, они делают потрясающую работу.Таким образом, это скорее причина, чем решение, но вместо того, чтобы тратить часы на его устранение, проверьте, не является ли это вашей проблемой, прежде чем тратить больше времени.

Эта проблема также похожа на ошибки, найденные в этой статье

0 голосов
/ 10 марта 2016

Это также привело к странному поведению файлов CSS в настройке CentOS / VirtualBox.

Вы можете изменить содержимое файла CSS в папке / vagrant, и браузер отобразит состояние 200(вместо 304), то есть он знал, что файл новый.Но содержание не изменилось бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...