Странное Поведение Кэша Vagrant/VirtualBox/Apache2

Я использую Vagrant для запуска VirtualBox с питанием от Ubuntu с Apache2.

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

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

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

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

6 ответов


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

JC,

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

EnableSendfile off

и для nginx: функция sendfile выкл;

лучшие, Митчелл!--3-->


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

найдите файл: $ sudo find -name "nginx.conf"

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

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

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

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


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

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

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

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

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

похож на Nginx (in nginx.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, зубных протезов и inodes.


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


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

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

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

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

sendfile off;
expires off;

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

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

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


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

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