Re: Странное поведение кэша nginx

Alexander Pyhalov alp на rsu.ru
Ср Июн 22 17:32:59 MSD 2011


Здравствуйте.

On 06/22/2011 16:36, Maxim Dounin wrote:
>
>>          open_file_cache max=2048 inactive=600s;
>>          open_file_cache_valid 2000s;
>>          open_file_cache_min_uses 1;
>> ##      open_file_cache_errors on;
>
> Вы сказали nginx'у кешировать открытые файловые дескрипторы и
> информацию о размере файлов в течение 2000 секунд.  Если при этом
> неатомарно изменить файл - то представление nginx'а о
> размере файла перестанет соответствовать реальности на указанные
> 2000 секунд.  В результате Content-Length в ответе будет один, а
> реально имеющихся данных в ответе - меньше (или столько же, но не
> все данные из файла).  В первом случае с точки зрения браузера
> ответ будет "не завершён" пока nginx не закроет соединение по
> завершению keepalive_timeout.
>
> Та же проблема будет наблюдаться и без open_file_cache, если
> обновлять файлы неатомарно, просто с open_file_cache вы
> увеличиваете масштаб проблемы с только тех запросов, которые
> отдавались в момент неатомарного изменения, до всех запросов за
> указанный период open_file_cache_valid.
>
> Правильное (и единственное) решение - обновлять файлы атомарно.
> Т.е. писать новый (временный) изменённый файл, а потом атомарно
> (mv подойдёт) переименовывать его в файл с правильным именем.
>
> Утверждение про "аналогичные конфигурации ... работают нормально"
> мне представляется сильно сомнительным.  Либо там файлы обновляют
> атомарно, либо вы просто чего-то не заметили.
>

Я провел следующий эксперимент - поставил open_cache_valid = 30s, теперь 
я после изменения файла получаю верную копию файла 1 раз в 30 секунд 
(видимо, после инвалидации кэша), затем опять получаю его кусок. А 
конфигурации с таким же конфигом nginx и правда работают нормально - на 
протяжении какого-то времени они отдают старые копии файла, а затем - 
обновленную версию. Да, и если я делаю
mv orig_file.xml orig_file.xml.1
vi orig_file.xml.1 //Изменяю файл
mv orig_file.xml.1 orig_file.xml - то опять получаю от сервера один раз 
в 30 секунд корректный ответ, а затем - куски файла.

-- 
С уважением,
Александр Пыхалов,
системный администратор ЮГИНФО ЮФУ.


Подробная информация о списке рассылки nginx-ru