Мы используем Nginx для обслуживания статических файлов на платформе разработки. Поскольку это платформа разработки, мы хотели бы отключить кэширование, чтобы каждое изменение распространялось на сервер. Конфигурация VHost довольно проста:
server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
Когда мы обращаемся к HTML-файлу ( http: //static.server.local/test.html ), у нас нет проблем: сервер возвращает код 304 Not Modified, если файл не изменен, и ответ 200 OK с измененный файл, когда файл изменяется.
Тем не менее, похоже, что с Javascript или CSS-файлом все по-другому. Как только файл будет изменен, мы получим ответ 200 OK, как и ожидалось, но со старым текстом.
Есть ли в Nginx механизм внутреннего кэша, который мог бы объяснить это поведение? Или какую-то конфигурацию, которую мы должны добавить?
Как примечание, вот заголовок, возвращаемый Nginx, когда файл был изменен (кажется правильным):
Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54
Редактировать
После пробных настроек с помощью expires
директивы и Cache-Control
заголовка я провел дальнейшие исследования. Фактически сервер установлен на гостевой Ubuntu VirtualBox, а данные считываются из общей папки, которая находится на хосте Mac OSX.
Если файл редактируется из IDE (NetBeans) на хосте, кажется, что изменения не появляются, тогда как если я редактирую его непосредственно на госте (используя VIM), он обновляется.
Странно то, что он не ведет себя аналогично с файлами HTML.
Довольно загадочно.
Редактировать 2 (ОТВЕТ)
Действительно, причина проблемы была больше на стороне VirtualBox. Или скорее конфликт между VirtualBox и опцией «sendfile» сервера.
Эта ссылка VirtualBox Ненавидит Sendfile дала мне решение: переключить SendFile флага в конфигурации сервера для отключения :
sendfile off;
Надеюсь, что это также может помочь другому человеку, использующему VirtualBox для разработки. :)
На форуме VirtualBox есть дополнительная информация .
источник
Ответы:
Поскольку ответ как-то скрыт в вопросе - вот решение для nginx в среде VirtualBox в качестве отдельного ответа.
В вашем конфиге nginx (обычно /etc/nginx/nginx.conf) или в конфигурационном файле vhost измените
sendfile
параметр наoff
:Хотя это и
sendfile
является основой славы Nginx (молниеносная низкоуровневая эффективность обслуживания статических файлов), это может быть бичом для локальной разработки, например, Javascripts, которые часто меняются и требуют перезагрузки. Тем не менее, Nginx sendfile умный и, вероятно, не является проблемой большинства людей; проверьте также параметры "отключить кеш" вашего браузера!источник
sendfile
подходит даже для локальной среды разработки; это только VirtualBox, в котором он сломан. По какой причине (из многих) я рекомендую избегать VirtualBox ...установите тэг expires на
и он не должен устанавливать какие-либо заголовки expires вообще, это также может быть кеширование файлов вашего браузера неправильно
источник
expires -1
и поведение остается тем же.Если ничто из вышеперечисленного не помогает, но Nginx возвращает старое содержимое ваших файлов, это может быть связано с проблемой
open_file_cache
.Смотрите как ссылку:
источник
Это старая ошибка в VirtualBox (см. # 819 , # 9069 , # 12597 , # 14920 ), где vboxvfs, похоже, имеет некоторые проблемы с mmapped-доступом к файлам, которые синхронизируются.
Это может произойти, когда вы редактируете файл вне виртуальной машины, и вы ожидаете увидеть такое же изменение внутри виртуальной машины.
Чтобы обойти эту проблему, вам нужно отключить поддержку sendfile ядра для доставки файлов клиенту, отключив
EnableSendfile
опцию . Это особенно неприятно для смонтированных файлов NFS или SMB.Для
Nginx
(измененияnginx.conf
), напримерАналогично для Apache (в
httpd.conf
или в файле vhosts), напримерПосле изменения перезагрузите Apache.
Другое потенциальное решение - не забывайте редактировать файлы на хосте или пытаться повторно редактировать тот же файл, но внутри виртуальной машины.
Другой обходной путь включает удаление кэша страниц Linux, например
Или очищать кеши каждую секунду (согласно этому посту ), попробуйте:
Примечание. Номер 1 обозначает освобождение кэша страниц, 2 - стоматологов и инодов, 3 - кэша страниц, стоматологов и инодов.
Вышеуказанная проблема может быть воспроизведена следующей программой mmap-test, см
mmap-problem.c
.источник
Это поздно, но все еще отмечен без ответа, поэтому я сделаю удар. Просто для смеха, вы пробовали:
Сам не пробовал, но научился пробовать подобные вещи с Nginx в контейнере сервера время от времени, когда у меня возникают подобные проблемы ...
источник