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


Мы используем 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 Не модифицировано до тех пор, пока файл не будет изменен, и 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 Hates Sendfile дал мне решение: переключить Отправить файл флаг в конфигурации сервера для от:

sendfile  off;

Надеюсь, это также поможет другому человеку, использующему VirtualBox для разработки. :)
Есть дополнительная информация о VirtualBox форум,


86
2018-05-13 14:18


Источник


Вы используете nginx в vagrant vm и используете общие fs? Было несколько сообщений о ваших симптомах с использованием этой комбинации в #nginx. - kolbyjack
Я мог бы буквально обнять тебя! Проведя 48 часов проклятия и безумно безумно с этой точной проблемой .., перекомпилировал nginx несколько раз, пожертвовал небольшими пушистыми существами для сортированных божеств, выучил директивы кэша назад ... все, чтобы узнать, что это одна странность, чтобы исправить благодаря VirtualBox, это странно! - James Butler
Было бы намного понятнее, если бы вы отправили свой ответ в качестве ответа и приняли его, чтобы каждый мог видеть, что эта проблема решена. - Zombaya
Это очень помогло мне. Спасибо. - Matt M.
Сегодня утром я попал в эту ошибку. Не понял бы, что это было до общей папки без этого. Благодаря! - Jaffa The Cake


Ответы:


Поскольку ответ каким-то образом скрыт в вопросе - вот решение для nginx в среде VirtualBox как автономный ответ.

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

sendfile  off;

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


57
2017-11-19 09:52



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


установите для тега expires значение

expires off;

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


15
2018-05-13 14:20



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


Это старая ошибка в 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.


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


Другим обходным решением является отказ от pagecache 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,


2
2017-12-13 14:03





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

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

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


1
2017-12-28 01:47





Если ничего не упомянуто выше, и все же Nginx возвращает старое содержимое ваших файлов, это может быть проблема, связанная с open_file_cache,

См. Ссылку:


1
2017-10-14 20:38