Странное поведение кэша Vagrant/VirtualBox/Apache2
-
13-11-2019 - |
Вопрос
Я использую Vagrant для запуска VirtualBox на базе Ubuntu с Apache2.
Веб-сервер, среди прочего, обслуживает статические файлы из каталога my /vagrant.
В большинстве случаев это хорошо работает.Но когда я меняю изображение в своей общей папке и перезагружаю веб-сайт, отображается предыдущая версия изображения, но она усечена.
Это работает, если я сначала удалю старую картинку из своей общей папки, обновлю веб-сайт, чтобы картинка не отображалась, затем сохраню новый файл и снова перезагрузлю веб-сайт.
Кто-нибудь знал об этой проблеме?У меня не установлено ничего особенного, только Apache 2 с mod_rewrite и PHP с Mongo, APC Plugin, MongoDB, а также NodeJS с кучей скриптов.
Решение
Нашел ответ здесь :
JC,
Что вы видите, вероятно, потому что сервер, обслуживающий статические файлы Используется SESCALL «SendFile ()», который нарушен с файлом VirtualBox система.Вам нужно отключить использование SendFile () на вашем сервере.Для Apache:
Включаетндифийки от
и для nginx: SendFile Off;
лучше, Митчелл
Другие советы
Это сводит меня с ума!Спасибо, что опубликовал это, Филипп.Для тех из вас, кто понятия не имеет, как изменить конфигурационный файл, вот что я сделал:
Чтобы найти файл: $ sudo find -name "nginx.conf"
Мой был здесь: ./etc/nginx/nginx.conf
Итак, я запустил это, чтобы изменить его: $ sudo nano ./etc/nginx/nginx.conf
Измените строку, содержащую sendfile on;
к sendfile off;
Не забывай об этом exit
и vagrant reload
!
Это старая ошибка в VirtualBox (см.: #819, #9069, #12597, #14920) где у vboxvfs, похоже, есть некоторые проблемы с mmapped доступом к файлам, которые синхронизированы.
Это может произойти, когда вы редактируете файл за пределами виртуальной машины и ожидаете увидеть те же изменения внутри виртуальной машины.
Чтобы обойти эту проблему, вам необходимо отключить поддержку kernel sendfile для доставки файлов клиенту, отключив EnableSendfile
вариант, либо в httpd.conf
или в файле vhosts, например.
<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>
Это особенно проблематично для файлов, подключенных к NFS или SMB.После внесения изменений перезагрузите Apache.
Аналогично для Nginx
(в nginx.conf
), например.
sendfile off;
Другой обходной путь заключается в том, чтобы не забывать редактировать файлы на хосте или попытаться повторно отредактировать тот же файл, но внутри виртуальной машины.
Другой обходной путь включает удаление кэша страниц Linux, например
echo 1 > /proc/sys/vm/drop_caches
Или очищать кэши каждую секунду (согласно этот пост), попробуйте:
watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches)
Примечание:Цифра 1 обозначает освобождение кэша страниц, 2 - для dentries и inode-ов, 3 - для pagecache, dentries и inode-ов.
Описанная выше проблема может быть воспроизведена с помощью следующей программы mmap-тестирования, см.: 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, DEBUBBAR и Browberbar и BrowserSYNC через Gulp.watch, вы можете получить эту ошибку.У меня именно та же ошибка имела такую же ошибку из-за того, как синхронизация браузера просыпается моим запросом. Если я просматривал свой сервер Dev через: http://127.0.0.1:3000/laravel/sage я получил ошибку http://127.0.0.1/laravel/sage Ошибка исчезла.
Я пометил его с нашими друзьями в браузерсе, они делают потрясающую работу.Итак, это скорее причина, чем решение, но, а не тратить часы, пытаясь его исправить, тестировать, чтобы увидеть, если это ваша проблема, прежде чем тратить больше времени.
Эта проблема также похожа на Ошибки, найденные в этой статье
Это также отвечает за странное поведение в отношении файлов CSS в настройке CentOS / VirtualBox.
Вы можете изменить содержимое файла CSS в / бродяженую папку, и браузер будет отображать состояние 200 (вместо 304), что означает, что он знал, что файл был новым.Но содержание не изменилось бы.