Используя 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
вывод лаклога: https://gist.github.com/onethumb/e66a2bc4727a3a5340b6
Varnish Trac: https://www.varnish-cache.org/trac/ticket/1506< /а>