###本項は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
キャッシュしつつも少しでもユーザ側の再生スタートを早くしたいというおもてなしです。
##デフォルト値の確認
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サーバ側でどのようなリクエストが来ているかみてみました。
"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する設定を投入
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;
}
}
すると。。。
"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レスポンスしなくなるのでヘッダ消してやりバッチリできました。