0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Varnish Cache: Range Request レンジリクエストのデフォルト仕様と変更

Last updated at Posted at 2021-05-31

###本項はLumen Edge Application DeliveryでのVarnishについての記述です
https://lumen-28.hubspotpagebuilder.com/lumen-technologies-japan/lumen-edge-cloud-app-delivery

#Varnish Cache: Range Request レンジリクエストのデフォルト仕様と変更
エンドユーザがリクエストするRangeリクエストByte範囲をそっくりそのままWEBサーバへ伝えて返却できるかという確認を行いました。

利用環境
Godaddy: Apache
Lumen: Edge Compute Varnish

キャッシュしつつも少しでもユーザ側の再生スタートを早くしたいというおもてなしです。

##デフォルト値の確認

CURL
C:curl -I "http://www.hoge.com/test/test.mp4" -r 0-2
HTTP/1.1 206 Partial Content
Date: Tue, 25 May 2021 04:47:31 GMT
Server: Apache
Upgrade: h2,h2c
Connection: Upgrade
Last-Modified: Tue, 25 May 2021 01:32:44 GMT
ETag: "894300a-c0c308-5c31d80b68b36"
Accept-Ranges: bytes
Content-Length: 1
Vary: Accept-Encoding,User-Agent
Content-Range: bytes 0-2/12632840
Content-Type: video/mp4

どうやらユーザ側からレンジリクエストを行うとちゃんと返却がされるようです。

WEBサーバ側でどのようなリクエストが来ているかみてみました。

Header_Varnish_to_WebServer
    "headers": {
        "Host": "www.hoge.com",
        "X-Forwarded-For": "125.30.xxx.xxx, 10.246.xxx.xxx",
        "User-Agent": "/7.28.0",
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "X-Varnish": "196894",
        "Content-Length": "0"
    },

ん、レンジリクエストが来ていない!!
普通はヘッダにRange: bytes=0-1023とかあるはずなのに!

どうやらデフォルト状態では:

[クライアント] ← レンジON → [Varnish] ← レンジOFF → [サーバ]
となっている様です。

そこで。。。

##VCLで別途Range RequestをForwardする設定を投入

VCL
    sub vcl_recv {
        if (req.http.Range ~ "bytes=") {
            set req.http.x-range = req.http.Range;
        }
    }

    sub vcl_hash {
        if (req.http.x-range ~ "bytes=") {
                hash_data(req.http.x-range);
                unset req.http.Range;
        }
    }

    sub vcl_backend_fetch {
        if (bereq.http.x-range) {
            set bereq.http.Range = bereq.http.x-range;
        }
    }

    sub vcl_backend_response {
        if (bereq.http.x-range ~ "bytes=" && beresp.status == 206) {
            set beresp.ttl = 10m;
            set beresp.http.CR = beresp.http.content-range;
        }
    }

    sub vcl_deliver {
        if (resp.http.CR) {
            set resp.http.Content-Range = resp.http.CR;
            unset resp.http.CR;
        }
    }

すると。。。

Header_Varnish_to_WebServer
    "headers": {
        "Host": "www.hoge.com",
        "X-Forwarded-For": "125.30.xxx.xxx, 10.246.xxx.xxx",
        "User-Agent": "/7.28.0",
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "x-range": "bytes=0-2",  ***ユーザから受け取ったRange入りました***
        "Accept-Encoding": "gzip",
        "X-Varnish": "197034",
        "Range": "bytes=0-2",  ***Range入りました***
        "Content-Length": "0"
    },

###ちゃんと入れてくれました!
一応クライアント→Varnishが受けたRange内容が "x-range" というヘッダ項目。
そして、実際のRangeリクエストが "Range": "bytes=0-2", という形ではいります。

あとはGodaddyの仕様で "Accept-Encoding": "gzip",があると206レスポンスしなくなるのでヘッダ消してやりバッチリできました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?