Vagrant/VirtualBox/Apache2 Поведение странного кэша

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

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

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

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

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

Ответ 1

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

JC,

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

EnableSendfile off

И для nginx: sendfile off;

Бест, Митчелл

Ответ 2

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

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

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

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

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

Не забывайте exit и vagrant reload!

Ответ 3

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

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

Чтобы обойти эту проблему, вам необходимо отключить поддержку файла sendfile для доставки файлов клиенту, отключив EnableSendfile option, либо в 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 означает освобождение pagecache, 2 для зубных рядов и inodes, 3 для pagecache, dentries и inodes.


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

Ответ 4

У меня есть аналогичная проблема с средой VirtualBox/Docker/Nginx.

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

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

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

sendfile off;
expires off;

Ответ 5

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

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

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

Ответ 6

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

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