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

sendfile  off;

Сподіваюсь, це також може допомогти іншій людині, яка використовує VirtualBox для розробки. :)
На форумі VirtualBox є додаткова інформація .


3
Чи запускаєте nginx у бродячому vm та використовуєте спільний fs? Було кілька повідомлень про ваші симптоми за допомогою цієї комбінації в #nginx.
колб'як

3
Я міг би буквально тебе обійняти !! Провели 48 годин на проклинання і зовсім з глузду з цього питання ..., кілька разів перекомпілював nginx, пожертвував деякими маленькими пухнастими істотами різним божествам, навчився кеш-директивам назад ... все, щоб дізнатися, що це одна лінійна дива. завдяки дивному VirtualBox!
Джеймс Батлер

13
Було б набагато зрозуміліше, якби ви опублікували свою відповідь як відповідь і прийняли її, щоб усі бачили, що ця проблема вирішена.
Зомбая

Мене сьогодні вдарив цей клоп. Не усвідомлював би, що це було в загальній папці без цього. Дякую!
JaffaTheCake

Дякую! Як я розумію, зараз це інший спосіб виправити цю помилку? Що робити, якщо мені потрібно активувати sendfile? :-)
Дмитро Белавенцев

Відповіді:


57

Оскільки відповідь якимось чином прихована у питанні - ось рішення для nginx у середовищі VirtualBox як окрема відповідь.

У вашому nginx config (зазвичай /etc/nginx/nginx.conf) або vhost config файл змініть sendfileпараметр на off:

sendfile  off;

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


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 та
docker

15

встановіть свій тег закінчується

expires off;

і він взагалі не повинен встановлювати заголовки закінчується, це також може бути неправильним кешування файлів браузера


На жаль, я це спробував так само добре, як expires -1і поведінка все одно.
Олів'є Чаппе

Щодо браузера, я подумав про такі можливості: спершу спробував Chrome, а після зміни файлу вперше відкрив його у Firefox: я все-таки отримав першу версію файлу.
Олів'є Чаппе

також заголовок кеш-керування, ймовірно, повинен бути CACHE-CONTROL: NO-CACHE
anthonysomerset

або видалити заголовок кеш-керування взагалі - вибачте, не
вдалося

1
У Windows "термін дії закінчується" все ще не вимикає кешування файлів html. Супер засмучує, коли я оновлюю файл у своєму IDE, але! $ #% Ing nginx обслуговує стару версію.
Дан Даскалеску


2

Це стара помилка в VirtualBox (див .: # 819 , # 9069 , # 12597 , # 14920 ), де vboxvfs, здається, має деякі проблеми з mmapped доступом до синхронізованих файлів.

Це може статися, коли ви редагуєте файл за межами VM, і ви очікуєте, що ви побачите таку ж зміну в VM.

Щоб вирішити цю проблему, вам потрібно відключити підтримку файлів sendfile для доставки файлів клієнту, вимкнувши EnableSendfileопцію відключення . Особливо це проблема для файлів, встановлених NFS або SMB.

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

sendfile off;

Подібне для Apache (у httpd.confфайлі або vhosts), наприклад

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

Після зміни перезавантажте Apache.


Іншим потенційним рішенням є просто пам’ятати про те, щоб не редагувати файли на хості або намагатися повторно редагувати той самий файл, але всередині VM.


Інше вирішення проблем включає в себе випадання кеш-сторінки 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.


1

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

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

Я сам не пробував цього, але навчився періодично пробувати подібні речі з Nginx у контейнері серверів, коли у мене є проблеми, подібні до цього ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.