Отключить кеширование при обслуживании статических файлов с помощью 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 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

Edit
После выполнения различных настроек с директивой expires и заголовком Cache-Control я провел ряд дальнейших исследований. Фактически, сервер устанавливается в гостевой Ubuntu VirtualBox, и данные считываются из общей папки, находящейся на хосте Mac OSX.
Если файл отредактирован из IDE (NetBeans) на хосте, кажется, что изменения не отображаются, тогда как если я отредактирую его непосредственно на гостевом компьютере (с помощью VIM), он обновится.
Странно то, что он не ведет себя так же с файлами HTML.
Довольно загадочный.

Изменить 2 (ANSWER)
Действительно, происхождение проблемы было больше на стороне VirtualBox. Вернее, конфликт между VirtualBox и опцией «sendfile» на сервере.
Эта ссылка VirtualBox Hates Sendfile дала мне решение: переключить sendfile в конфигурации сервера выкл :

sendfile  off;

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

86 голосов | спросил Olivier Chappe 13 Maypm11 2011, 18:18:12

5 ответов


57

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

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

sendfile  off;

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

ответил lorem monkey 19 32014vEurope/Moscow11bEurope/MoscowWed, 19 Nov 2014 12:52:16 +0300 2014, 12:52:16
15

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

expires off;

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

ответил anthonysomerset 13 Maypm11 2011, 18:20:32
2

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

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

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

Для Nginx (изменение в Nginx) , например

nginx.conf

Аналогично для Apache (в sendfile off; или в файле vhosts), например

httpd.conf

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


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


Другим обходным решением является удаление пагеки Linux, например.

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

Или очистить кеши каждую секунду (как этот пост ), попробуйте:

echo 1 > /proc/sys/vm/drop_caches

Примечание: номер 1 означает освобождение pagecache, 2 для зубных рядов и inodes, 3 для pagecache, dentries и inodes.


Вышеупомянутая проблема может быть реплицирована следующей программой mmap-test: см. watch -n 1 $(sync; echo 1 > /proc/sys/vm/drop_caches) .

ответил kenorb 13 TueEurope/Moscow2016-12-13T17:03:43+03:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2016 17:03:43 +0300 2016, 17:03:43
1

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

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

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

ответил ColtonCat 28 WedEurope/Moscow2011-12-28T05:47:59+04:00Europe/Moscow12bEurope/MoscowWed, 28 Dec 2011 05:47:59 +0400 2011, 05:47:59
1

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

См. ссылку:

ответил k2s 14 +03002015-10-14T23:38:19+03:00312015bEurope/MoscowWed, 14 Oct 2015 23:38:19 +0300 2015, 23:38:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132