Як я можу запобігти lighttpd кешувати статичні файли, навіть коли вони модифіковані на диску?


10

Я використовую lighttpd для обслуговування статичних файлів. У мене є купа зображень у режимі, які я регулярно оновлюю. Це змінить вміст файлу (і розмір файлів), а також дату модифікації, але не їх ім'я файлу.

Коли я отримую доступ до файлів через http, оновлення не враховуються, і вони легко обслуговують старий файл. Я можу вручну перейменувати файл на щось інше, тоді lighttpd поверне помилку 404, і якщо я перейменую свій файл назад, я отримаю правильну оновлену версію. Здається, що легкий використовує якийсь власний механізм кешування (що добре) для повернення статичних файлів. На жаль, схоже, що цей механізм не оновлюється при зміні файлів.

Я перевірив Wireshark, і мій браузер дійсно робить запит у файл, це не проблема кешування браузера. Він повертає 200 ОК, коли вимагає його з порожнього кеша, і 304 Не змінено інакше, як очікувалося. Але файл повертається з неправильним заголовком Last-Modified, який не відображає реальної дати останньої модифікації.

Можливо, є якась директива конфігурації, про яку я не знаю?

Мені хотілося б, щоб файли, повернені легкими, відображали зміни, внесені на диск безпосередньо, або принаймні мати можливість недійсно кешувати.

Оновлення для всіх, хто перейшов до цього питання: я знайшов винуватця. Якщо я оновлюю статичний файл, Lighty не повертає новий вміст, але повертає нову довжину вмісту в його заголовки, в результаті чого відображається сміття. Якщо я стискаю файл за допомогою mod_compress, проблема усувається, оскільки mod_compress використовує власну систему кешування. На жаль, я не можу стискати всі файли (наприклад, файли зображень). Тож це лише часткове виправлення, але я повернусь до цього пізніше і з надією знайду рішення.

Відповіді:


6

Я нарешті знайшов проблему. І він походить від VirtualBox.

Під час редагування файлу в хості (Win), lighttpd у гостьовій (Linux) не оновлює вміст файлу (але коректно оновлює розмір файлу), повертаючи таким чином обрізаний або зібраний вміст.

Демонтація моїх спільних накопичувачів та повторна їх установка чи редагування файлів безпосередньо в гості виправили проблему.

На це мені знадобилося 6 місяців, щоб нарешті зрозуміти це.


3

Ви не згадуєте, встановлений у вас mod_cache чи ні? Цей модуль за замовчуванням встановлений на "увімкнено" при встановленні.

Я не люблю пропонувати це, але чи допомагає включення Etags?


mod_cache не встановлений. ETags увімкнено (але inode не використовується для генерування ETag). Я спробував включити inode або відключити ETag, але безрезультатно.
Pixelastic

2

Спробуйте встановити кешування двигуна stat на "вимкнено":

server.stat-cache-engine = "disable'

Дякую, але це не впливає. Однак я не знав цієї директиви, і це може стати в нагоді пізніше.
Pixelastic

Можливо, між вами та сервером є проксі-посередник? Спробуйте перезапустити сервер і отримати доступ до того ж файлу. Ви використовуєте mod_compress?
Олексій Корзун

Я запускаю VMU Ubuntu в хості Windows 7. Легкий у ВМ. Я не думаю, що тут може виникнути проблема з проксі. Я перезапустив сервер, але це не очищає легкий кеш. Я використовую mod_compress, але не для цих файлів. Я спробую перезапустити цілий VM і відключити mod_compress, щоб побачити, чи зміниться щось. Дякую за ідеї.
Pixelastic

Хм, я можу щось тут. Якщо я зміню файл на менший (але з таким же ім’ям), я отримав лише верхню половину файлу. Схоже, старий файл відображається із довжиною вмісту поточного. Якщо я заміню на більший файл, відображається весь (старий) файл. Здається, враховуються зміни розміру файлів, але не вміст файлу.
Pixelastic

Вибачте за коментарі зі спамом: відключення mod_compress нічого не змінює, а також не перезапускає всю VM.
Pixelastic

2

Цей варіант lighttpd працював для мене

server.network-backend = "writev" 

Працював як шарм для мене, на VM Debian на робочому столі Debian, дякую!
Іван

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