Назад | Перейти на главную страницу

Отключить кеширование при обслуживании статических файлов с помощью 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 ОК ответ с измененным файлом при изменении файла.
Однако, похоже, он ведет себя по-разному с файлом Javascript или CSS. После изменения файла мы получаем 200 ОК ответ, как и ожидалось, но со старым текстом.
Есть ли в 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  off;

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

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

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

sendfile  off;

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

установите тег истечения срока действия на

expires off;

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

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

См. Ссылку:

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

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

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

Это старая ошибка в 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 - для dentries и inodes, 3 - для pagecache, dentries и inodes.


Вышеуказанная проблема может быть воспроизведена следующей программой mmap-test, см. mmap-problem.c.