13

Varnish 4を使用して、有効なContent-Lengthヘッダーとヘッダーなしで応答する一連のバックエンドがありますTransfer-Encoding

クライアントからの最初のヒットで、これらのヘッダーでクライアントに応答するのではなく、Varnish はヘッダーを削除して応答Content-Lengthに追加します。Transfer-Encoding: chunked(興味深いことに、ペイロードにはチャンクが含まれていないようです。これは 1 つの連続したペイロードです)。

Content-Lengthこれは、ヘッダーに基づいてセグメント サイズ、帯域幅などの分析を行おうとする Flash ビデオ プレーヤーなどのクライアントに深刻な問題を引き起こします。彼らの分析は失敗し、マルチビットレートのストリーミングなどを行うことはできません。

私は次のようないくつかの半明白なことを試しました:

  • 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

ワニストラック: https://www.varnish-cache.org/trac/ticket/1506

4

3 に答える 3

6

とりあえず、do_stream = falseやりたいようにやります。

バックエンドがチャンクなしで送信する場合のチャンク エンコーディングを回避することは、将来の Varnish の改善の可能性です。

例:

sub vcl_backend_response {
        if(beresp.http.Content-Type ~ "video") {
                set beresp.do_stream = false;
                set beresp.do_gzip = false;
                //set resp.http.Content-Length = beresp.http.Content-Length;
        }
        if(beresp.http.Edge-Control == "no-store") {
                set beresp.uncacheable = true;
                set beresp.ttl = 60s;
                set beresp.http.Smug-Cacheable = "No";
                return(deliver);
        }
}
于 2014-05-14T18:45:22.140 に答える