Используя Varnish 4, у меня есть набор бэкэндов, которые отвечают действительным заголовком Content-Length
и заголовком Transfer-Encoding
.
При первом попадании клиента, а не на клиенте с этими заголовками, Varnish отбрасывает заголовок Content-Length
и добавляет Transfer-Encoding: chunked
к ответу. (Интересно, что полезная нагрузка не содержит каких-либо куски в нем - это один непрерывный полезной нагрузки).
Это создает серьезные проблемы для клиентов, таких как Flash-видеоплееры, которые пытаются выполнить анализ сегмента, ширины полосы и т.д. на основе заголовка Content-Length
. Их анализ терпит неудачу, и они не могут делать такие вещи, как потоки с несколькими битрейтами и т.д.
Я пробовал несколько полу-очевидных вещей вроде:
-
beresp.do_stream = true
-
beresp.do_gzip = false
-
unset req.http.Accept-Encoding
Пример ответа на бэкэнд:
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 19:44:35 GMT
Server: Apache
Content-Length: 796618
Connection: keep-alive
Пример ответа на лак:
HTTP/1.1 200 OK
Server: Apache
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 23:10:06 GMT
X-Varnish: 2
Age: 0
Transfer-Encoding: chunked
Accept-Ranges: bytes
Последующие нагрузки объекта действительно включая Content-Length
заголовок, просто не первый груз в кэш.
VCL: https://gist.github.com/onethumb/e64a405cc579909cace1
вывод varnishlog: https://gist.github.com/onethumb/e66a2bc4727a3a5340b6
Varnish Trac: https://www.varnish-cache.org/trac/ticket/1506