Отключить кэширование при обслуживании статических файлов с помощью Nginx (для разработки)

89

Мы используем 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 есть дополнительная информация .

Оливье Чаппе
источник
3
Вы запускаете nginx в vagrant vm и используете общий fs? Было несколько сообщений о ваших симптомах при использовании этой комбинации в #nginx.
kolbyjack
3
Я мог буквально обнять тебя !! Провёл 48 часов, ругаясь и сходя с ума от этой проблемы .., несколько раз перекомпилировал nginx, пожертвовал несколько маленьких пушистых созданий различным божествам, выучил директивы кеша в обратном направлении ... все, чтобы выяснить, что это одна строчка, которую нужно исправить благодаря VirtualBox странно!
Джеймс Батлер
13
Было бы намного понятнее, если бы вы опубликовали свой ответ в качестве ответа и приняли его, чтобы все могли видеть, что эта проблема решена.
Зомбая
Сегодня утром меня поразила эта ошибка. Не понял бы, что это было до общей папки без этого. Спасибо!
JaffaTheCake
Спасибо! Как я понимаю, сейчас нет другого способа исправить эту ошибку? Что если мне нужно включить sendfile? :-)
Дмитрий Белавенцев

Ответы:

57

Поскольку ответ как-то скрыт в вопросе - вот решение для nginx в среде VirtualBox в качестве отдельного ответа.

В вашем конфиге nginx (обычно /etc/nginx/nginx.conf) или в конфигурационном файле vhost измените sendfileпараметр на off:

sendfile  off;

Хотя это и sendfileявляется основой славы Nginx (молниеносная низкоуровневая эффективность обслуживания статических файлов), это может быть бичом для локальной разработки, например, Javascripts, которые часто меняются и требуют перезагрузки. Тем не менее, Nginx sendfile умный и, вероятно, не является проблемой большинства людей; проверьте также параметры "отключить кеш" вашего браузера!

Lorem Monkey
источник
5
+1, хотя ответ должен объяснить, почему это необходимо, вместо того, чтобы эффективно оставлять читателей для поиска / перечитывания вопроса в поисках ссылок. Заставь ответ стоять самостоятельно -> лучше.
AD7six
2
Это, кажется, ответ для меня. Кажется, проблема возникает с определенной комбинацией Sendfile, VirtualBox и хоста OSX. abitwiser.wordpress.com/2011/02/24/virtualbox-hates-sendfile forums.virtualbox.org/viewtopic.php?f=1&t=24905
Стив Беннет,
sendfileподходит даже для локальной среды разработки; это только VirtualBox, в котором он сломан. По какой причине (из многих) я рекомендую избегать VirtualBox ...
Майкл Хэмптон
спасибо за сохранение, странная проблема с Vagrant / VirtualBox / Ubuntu / Wordpress, я предполагаю, что моя среда PROD безопасна с sendfile по умолчанию.
sonjz
Решает мою проблему с nginx и докером
PascalTurbo
15

установите тэг expires на

expires off;

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

anthonysomerset
источник
К сожалению, я попробовал это так же, expires -1и поведение остается тем же.
Оливье Чаппе
Что касается браузера, я подумал об этой возможности: я сначала пробовал использовать Chrome, а после изменения файла впервые открыл его в Firefox: я все еще получил первую версию файла.
Оливье Чаппе
также заголовок контроля кеша, вероятно, должен быть CACHE-CONTROL: NO-CACHE
anthonysomerset
или вообще удалите заголовок
элемента
1
В Windows «expires off» по-прежнему не отключает кэширование html-файлов. Очень неприятно, когда я обновляю файл в моей IDE, но! $ #% Ing nginx обслуживает старую версию.
Дан Даскалеску
2

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

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

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

ДляNginx (изменения nginx.conf), например

sendfile off;

Аналогично для Apache (в httpd.confили в файле vhosts), например

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

После изменения перезагрузите Apache.


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


Другой обходной путь включает удаление кэша страниц 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.

kenorb
источник
1

Это поздно, но все еще отмечен без ответа, поэтому я сделаю удар. Просто для смеха, вы пробовали:

location ~* \.(css|js)$ {
    expires 0;
    break;
}

Сам не пробовал, но научился пробовать подобные вещи с Nginx в контейнере сервера время от времени, когда у меня возникают подобные проблемы ...

ColtonCat
источник