varnish

varnish4 デバイス毎にキャッシュする

更新日:

リクエストとキャッシュの紐づけ

Varnish4がリクエストをどういう風にキャッシュするか、良くわかっていなかったので調べてみた。参考にしたのは公式ドキュメント。しかし、思いっきりVarnish3用の内容なのでコピペ禁止。

Internally, when Varnish stores content in the cache it stores the object together with a hash key to find the object again. In the default setup this key is calculated based on the content of the Host header or the IP address of the server and the URL.

デフォルトのdefault.vclだと、リクエストを投げてきた人のIPアドレス・URL毎にキー・コンテンツをストアする、らしい。Varnish3のdefault.vclにはデフォルトで以下のように書かれている、らしい。URLとHost名またはIPアドレスの対を使っている。

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (lookup);
}

Varnish4ではvcl_hashはlookupを返してはならないため、コピペすると構文エラーになる。
直後に改造の指針が書かれている。「vcl_recvでヘッダを付与して、vcl_hash で付与したヘッダをキーにハッシュ化する」という流れにすべし、とのこと。

デバイス毎にキャッシュする

以下の3種類の情報を使ってリクエストをハッシュ化する、というのが基本的な考え方。

  • URL
  • Host名(IPアドレス)
  • User-Agent>

ただし、User-Agentは種類が多すぎてキーがバラけ過ぎてしまう。用途に応じた粒度になるように"端末区分"を振りなおす。
例えば「iPhone」「Android」「その他」で表示内容が異なるサイトを展開する場合、端末区分として「iPhone」「Android」「その他」の3種類を設定する。

sub vcl_recv {
    ...
    if (req.http.user-agent ~ "(iPhone)+"){
       set req.http.X-UA-Device = "iphone";
    } else if (req.http.user-agent ~ "(Android(.+))+"){
       set req.http.X-UA-Device = "android";
    } else {
       set req.http.X-UA-Device = req.http.user-agent;
    }
    ...
}
sub vcl_hash {
    hash_data(req.url);
    # 追加
    hash_data(req.http.X-UA-Device);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (hash);
}

-varnish

Copyright© ikuty.com , 2018 AllRights Reserved Powered by AFFINGER4.