Re: при изменении static файла nginx отдает мусор (BUG?)

Maxim Dounin mdounin на mdounin.ru
Ср Окт 11 17:53:47 UTC 2017


Hello!

On Wed, Oct 11, 2017 at 12:56:49PM -0400, neomaq wrote:

> Ubuntu 16.04
> nginx -v 1.12.1
> 
> При изменении static файла nginx отдает мусор несколько секунд
> 
> 
> имеем  тривиальный location:
> 
> location ~
> \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|ico|swf|xml|mp3|html|svg)$
>         {
>         root   /var/www;
>         etag on;
>         }
> 
> меняю текстовый файл,  расположенный в в данном location
> и наблюдаю следующую картину:
> 
> по http заголовкам видно, что первые 5-15 секунд скачет вперед-назад во
> времени заголовок "Last-Modified"
> и "Content-length" и "Etag"
> 
> как будто nginx отдает разные файлы,  через несколько секунд это
> прекращается и nginx отдает корректный файл,
> с правильным содержимым

[...]

Файлы надо менять атомарно.  Пишете новую версию файла, потом 
делаете mv в нужное имя.

Любая попытка редактировать файлы "по месту" - чревата тем, что 
nginx откроет файл и начнёт его читать до обновления, а продолжит - 
уже после, и таким образом клиенту уйдёт причудливая смесь двух 
файлов.  В хорошем случае, если файл стал меньше, nginx проблему 
заметит и ругнётся в лог, в плохом - просто клиент получит мусор.

В вашем случае, судя по всему, ситуация усугубляется ещё и 
включённым open_file_cache, который позволяет наблюдать 
вышеописанный race с гарантией, так как время между открытием 
файла и его отдачей может доходить до 60 секунд 
(open_file_cache_valid).

-- 
Maxim Dounin
http://nginx.org/


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