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