Иногда, когда объекта нет в кеше, лак отправляет объект, реальный размер которого меньше, чем размер, объявленный в заголовке content-length. Например - только часть картинки.
Можно ли построить такое правило...? if (beresp.http.content-lenght <> real_object_body_size) { return(retry); }
Я написал скрипт, который тестирует один и тот же запрос на лаке и бэкенде. Он сравнивает загруженный размер с заголовком Content-Light. Бэкэнд, в отличие от лака, иногда заканчивается тайм-аутом, но размер всегда в порядке. Проблема возникает редко, но раздражает, потому что для объектов установлено длительное время кэширования пользователя.
Через несколько дней я могу сказать, что проблема заключалась в случайных проблемах бэкенда с возможностью лака отправлять фрагментированную передачу, если объект отсутствует в кеше.
Спасибо @Thijs Feryn за указание на это. Я знал об этом свойстве, но пока не прочитал его здесь, я вообще не связывал его со своей проблемой.
Кажется, что "set beresp.do_stream = false;" решило проблему.
Не могли бы вы предоставить вывод VSL для поддержки вашего случая? Также имейте в виду, что Varnish пытается использовать фрагментированное кодирование передачи при отправке извлеченного контента, который еще не сохранен в кеше. Как только весь объект окажется в кеше, Varnish узнает его размер и вернет правильный заголовок
Content-Length
. Но, как уже было сказано: я хотел бы, чтобы какая-нибудь Varnish Shared Memory поддерживала этот случай, прежде чем мы попытаемся продолжить его изучение.