Re: Битые файлы в кеше при gzip ответах

2019-08-20 Пенетрантность Maxim Dounin
Hello!

On Mon, Aug 19, 2019 at 08:08:21PM -0400, Vladislavik wrote:

> В общем, более менее разобрался, виноват был open_file_cache, интересная
> ситуация с ним выходит:
> у нас есть файл 10 кбайт, мы его запросили единожды и он попал в этот кэш.
> (если срок жизни кэша большой) Далее файл изменился, стал 15 кбайт и nginx
> при запросе файла отдает с диска уже измененный файл, НО обрезает его до
> длины, данные о которой все еще лежат в open_file_cache (10 кбайт) в итоге
> мы получаем обрезанный / не полный файл на выходе.

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

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-19 Пенетрантность Vladislavik
В общем, более менее разобрался, виноват был open_file_cache, интересная
ситуация с ним выходит:
у нас есть файл 10 кбайт, мы его запросили единожды и он попал в этот кэш.
(если срок жизни кэша большой) Далее файл изменился, стал 15 кбайт и nginx
при запросе файла отдает с диска уже измененный файл, НО обрезает его до
длины, данные о которой все еще лежат в open_file_cache (10 кбайт) в итоге
мы получаем обрезанный / не полный файл на выходе.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285346#msg-285346

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-19 Пенетрантность Maxim Dounin
Hello!

On Mon, Aug 19, 2019 at 05:32:55PM -0400, Vladislavik wrote:

> chunked_transfer_encoding on;
> 
> Не может быть причиной?

Нет - как видно из ответа в кэше, используется Content-Length, 
chunked transfer encoding не используется вообще.  Не говоря уже о 
том, что эта директива со значением "on" не имеет смысла, это 
поведение по умолчанию.

> Файл никто не переписывает, лежит и никак не меняется не обновляется, а
> nginx порой отдает его обрезанным...

Опять же из заголовков ответов в кэше очевидно, что это не так:

Last-Modified: Sun, 18 Aug 2019 12:06:39 GMT
Last-Modified: Sun, 18 Aug 2019 13:49:45 GMT 

То есть у файла менялся не только размер, но и дата последнего 
изменения.  В файл явно кто-то лазил, как и чем - искать вам.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-19 Пенетрантность Vladislavik
chunked_transfer_encoding on;

Не может быть причиной?
Файл никто не переписывает, лежит и никак не меняется не обновляется, а
nginx порой отдает его обрезанным...

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285342#msg-285342

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-19 Пенетрантность Maxim Dounin
Hello!

On Sun, Aug 18, 2019 at 11:12:31AM -0400, Vladislavik wrote:

> этот запрос был без gzip, файл каким-то образом nginx был отдан не
> полностью, с указанием размера 3492 вместо 3518, как это может быть? Файл
> лежит на диске,

Как уже говорилось - если файл отдаёт nginx, то наиболее вероятная 
причина - файл на диске кто-то переписывает по месту.  Если файл 
не меняется - это может быть какая-нибудь забытая синхронизация, 
которая просто копирует все файлы с другой машины / из другого 
каталога.  

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-18 Пенетрантность Vladislavik
этот запрос был без gzip, файл каким-то образом nginx был отдан не
полностью, с указанием размера 3492 вместо 3518, как это может быть? Файл
лежит на диске,

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285335#msg-285335

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-18 Пенетрантность Vladislavik
когда битый файл в кэше лежит, в заголовках в файле кэша указан его не
полный размер, а так же сам файл обрезан

L]]O?Y]WY]zŘy"5d593f4f-da4"Accept-Encoding¶,܋° OW6ì
KEY: server.com/js/1.js?44
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 18 Aug 2019 13:50:05 GMT
Content-Type: application/javascript; charset=UTF-8
Content-Length: 3492
Last-Modified: Sun, 18 Aug 2019 12:06:39 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5d593f4f-da4"
Cache-Control: public, max-age=31536000, stale-while-revalidate=31536000,
stale-if-error=31536000
Pragma: cache
Accept-Ranges: bytes



когда файл целый, в кэше лежит уже полный файл, в заголовках в файле кэша
указан полный размер

S]]yWY]_Y]õyy"5d595779-dbe"Accept-EncodingѦ@6¡S q5¿N
KEY: server.com/js/1.js?45
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 18 Aug 2019 14:22:02 GMT
Content-Type: application/javascript; charset=UTF-8
Content-Length: 3518
Last-Modified: Sun, 18 Aug 2019 13:49:45 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5d595779-dbe"
Cache-Control: public, max-age=31536000, stale-while-revalidate=31536000,
stale-if-error=31536000
Pragma: cache
Accept-Ranges: bytes

Файл без упаковки так и весит, 3518

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285334#msg-285334

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Maxim Dounin
Hello!

On Wed, Aug 14, 2019 at 08:43:39AM -0400, Vladislavik wrote:

> Ничего не генерится, файлы лежат на диске, созданы один раз и записаны на
> диск. Nginx должен сжать его на лету и отдать, вот, что от него требуется,
> он это выполняет, но иногда в кэше браузера/клаудфлера лежит обрезанный

Что лежит в кэшах браузера и клаудфлера - вопрос к браузеру и 
клаудфлеру соответственно.  Исходный вопрос был про proxy cache - 
что лежит в нём, когда наблюдается проблема?

> файл, например половина его (уже разжатый, тупо не весь, не хватает куска
> кода в конце файла) возникает ли ошибка при разжатии я не знаю, видно
> только, что файл читаемый, но код не полный, чаще только половина его) я так
> понял, что в процессе передачи или упаковки возникает какая-то проблема и
> nginx принимает файл от другого nginx/браузера без проверки его на
> целостность...Размеры файлов не более 20кб.
> Вопрос такой: возможно ли распаковать архив, если он получен не полностью?
> (Тк тест в js файла читаемый, но файл состоит только из половины того, что
> должно быть)

Распаковать - возможно.  При распаковке будет известно, полностью 
получен ответ или нет - по наличию/отсутствию gzip trailer'а (8 
байт с CRC32 и размером несжатого ответа).  Что делает с этой 
информацией конкретный распаковщик - тайна сия великая есть, да и 
не важно.  Смотреть надо строго на то, что лежит в кэше nginx'а, 
см. выше.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Vladislavik
Ничего не генерится, файлы лежат на диске, созданы один раз и записаны на
диск. Nginx должен сжать его на лету и отдать, вот, что от него требуется,
он это выполняет, но иногда в кэше браузера/клаудфлера лежит обрезанный
файл, например половина его (уже разжатый, тупо не весь, не хватает куска
кода в конце файла) возникает ли ошибка при разжатии я не знаю, видно
только, что файл читаемый, но код не полный, чаще только половина его) я так
понял, что в процессе передачи или упаковки возникает какая-то проблема и
nginx принимает файл от другого nginx/браузера без проверки его на
целостность...Размеры файлов не более 20кб.
Вопрос такой: возможно ли распаковать архив, если он получен не полностью?
(Тк тест в js файла читаемый, но файл состоит только из половины того, что
должно быть)

Если gzip архив можно распаковать, получив только половину файла, то может
быть проблема в передаче и не удостоверении, что файл передан полностью.

Если архив невозможно распаковать, не получив полностью, значит проблема в
упаковщике.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285271#msg-285271

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Maxim Dounin
Hello!

On Wed, Aug 14, 2019 at 07:53:54AM -0400, Vladislavik wrote:

> Бэкэенд это nginx который шлет обычные файлы js сжатые с помощью встроенного
> gzip

Так, а "обычные файлы js", случайно, не перегенерятся (и/или 
редактируюстся) регулярно?

Ну и отступая на пару шагов назад: битые файлы - это что?  
Обрезанный gzip-контейнер, при распаковке возникает ошибка? Или 
структура gzip-контейнера не нарушена, всё штатно распаковывается 
без ошибок, но по результатом распаковки получается только часть 
того, что ожидалось в файле?

Если второе - то это выглядит как проблема с генерацией файлов.  
Такое бывает, если генерить файлы "по месту" - если к файлу 
обрататься, пока пишется новая версия, то из него прочитается 
только часть, уже записанная, но никто не обещал, что это будет 
ожидаемый файл полностью.  Соответственно эта часть и будет 
отправлена клиенту и закэширована.

Чтобы такого не было - надо менять файлы атомарно: написать новый 
файл рядом с временным именем, потом сделать rename() / mv в 
нужное имя.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Vladislavik
Бэкэенд это nginx который шлет обычные файлы js сжатые с помощью встроенного
gzip

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285269#msg-285269

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Maxim Dounin
Hello!

On Wed, Aug 14, 2019 at 07:30:41AM -0400, Vladislavik wrote:

> Максим, прокси версии 1.1 итак установлен, битые файлы на нем и получаются.
> Клаудфлер тоже использует 1.1 у них так же битые файлы часто лежат в кеше,
> проверял лично.

Если так, то наиболее вероятная причина - бэкенд так прислал.  
Почему и как вылечить - уже, видимо, вопрос к бэкенду.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Vladislavik
Максим, прокси версии 1.1 итак установлен, битые файлы на нем и получаются.
Клаудфлер тоже использует 1.1 у них так же битые файлы часто лежат в кеше,
проверял лично.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285267#msg-285267

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-14 Пенетрантность Maxim Dounin
Hello!

On Tue, Aug 13, 2019 at 09:52:16PM +0300, Владислав Толмачев wrote:

> Добрый день, не пойму как исправить ситуацию, nginx иногда хранит в proxy
> кеше битые обрезанные файлы, при использовании на бэкенде gzip, тот же баг
> замечен на клаудфлер, иногда в его кеше лешит обрезанный файл, например
> половина js файла и помогает только сброс кеша и запрос файла еще раз, что
> бы файл стал полный. Что подкрутить, что бы не выключать gzip и http1.1? В
> клаудфлере даже замечено то, что половина кэш серверов сохраняет полный
> файл, половина хранит его обрезанную версию и выдает ее как правильную

Использование сжатия на бэкенде обычно означает, что заголовка 
Content-Length в ответах бэкенда не будет.  Соответственно в 
HTTP/1.0 окончание ответа будет определяться по закрытию соединения, и 
если бэкенд по каким-то причинам закрывает соединение, не дослав 
ответ полностью, то такой ответ имеет шансы быть сохранённым в кэш 
частично.

Лучше всего в подобной ситуации - разобраться, почему таки 
закрываются соединения, и полечить.  Но в качестве workaround'а 
скорее всего сработает "proxy_http_version 1.1;" в конфиге.

Подробнее тут:

http://nginx.org/r/proxy_http_version/ru

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: Битые файлы в кеше при gzip ответах

2019-08-13 Пенетрантность S.A.N
> кеше битые обрезанные файлы, при использовании на бэкенде gzip, тот же
> баг

Попробуйте выключить настройку в конфигt Nginx
sendfile off;
Нам это помогло.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285250,285255#msg-285255

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru