Smart Communication Design Company
ホーム > ナレッジ > Blog > CMS Blog > 2010年2月 > Varnishの設定 その1

Varnishの設定 その1

2010年2月12日
システムエンジニア 野沢

今回は簡単な設定を行い各サブルーチンの役割を見ていきます。

backend

backend default {
    .host = "192.168.0.1";
    .port = "80";
}

データを取りに行くバックエンドサーバ(Webサーバ)を指定します。
localhostやローカルネットワーク内でも構いませんし、グローバル越しでもサーバからアクセスできるところであれば取得することが可能です。名前解決が出来ればホスト名またはFQDNでの記載も可能ですが、最初のコンパイル時にIPに変換され組み込まれるため、IPが変わった場合は設定ファイル再読み込みが必要となります。

default 部分が設定名となり、変更や複数設定することが可能です。

例:

backend mitsue {
    .host = "172.24.0.1";
    .port = "80";
}
backend solution {
    .host = "172.24.0.2";
    .port = "80";
}

vcl_recv

sub vcl_recv {
}

メインのブロックであり、C言語のmain(){}と同じような役割を行います。
このブロックでは主にバックエンドの指定、キャッシュの可否を設定します。

# backend server
if (req.http.host == "www.mitsue.co.jp") {
    set req.backend = mitsue;
}
else {
    error 400 "Forbidden";
}

# no cache
if (req.request != "GET" && req.request != "HEAD") {
    pipe;
}
if (req.http.Cookie && req.http.Cookie ~ "authtoken=") {
    pass;
}
if (req.http.Authenticate || req.http.Authorization) {
    pass;
}

# lookup anyway;
lookup;

pipeやpassを記述することにより、その箇所でrevlを抜け次のブロックへ進みます。
条件に当てはまらなかった場合はlookupへ進み、キャッシュ判定を行います。


vcl_hash

sub vcl_hash {
}

lookupにて進んできた場合、hashブロックでキャッシュデータのhash値生成およびキャッシュの有無を判定します。

set req.hash += req.url;
if (req.http.host) {
    set req.hash += req.http.host;
} else {
    set req.hash += server.ip;
}

データのハッシュ値は基本的にURLで生成されますが、IPやUser-Agentを入れることにより、同じURLでもキャッシュデータを分けることが可能となります。携帯向けのコンテンツなど、機種ごとに別々のキャッシュデータを作成する時に便利です。


vcl_fetch

sub vcl_fetch {
}

キャッシュに返送できるデータがなかった場合、バックエンドサーバからコンテンツを取得し、その内容によりキャッシュの可否・時間を設定します。

if (!obj.cacheable) {
    pass;
}
if (obj.http.Set-Cookie) {
    pass;
}
if(obj.http.cache-control ~ "no-cache" || obj.http.Pragma ~ "no-cache") {
    pass;
}

実際にはキャッシュできないコンテンツをキャッシュさせないようにします。

    set obj.ttl = 3600s;
    set obj.grace = 30s;

Varnishでキャッシュする時間のデフォルト値を指定します。


ここからが実際のコンテンツをキャッシュさせる場合の設定です。
基本的にはキャッシュさせたいコンテンツをURLでマッチさせキャッシュ時間を設定していくかたちになります。

例:
頻繁に更新されるページのキャッシュを短く設定。

if(req.url ~ "/news/") {
    set obj.http.cache-control = "max-age = 60";
    set obj.ttl = 60s;
}

例:
画像等、あまり変更されないファイルのキャッシュ時間を長く設定。

if(req.url ~ "\.((gif)|(jpeg)|(jpg)|(png)|(css)|(js))$") {
    set obj.http.cache-control = "max-age = 86400";
    set obj.ttl = 86400s;
}

その他のブロック

その他には下記のようなブロックがあります。

vcl_pipe : Varnishを通過させる際の処理
vcl_pass : Varnishでキャッシュさせない時の処理
vcl_hit  : キャッシュにヒットした時の処理
vcl_miss : キャッシュにヒットしなかった時の処理
vcl_error : 各種エラーの時の処理
vcl_deliver : コンテンツを送信する際の処理

これらのブロックについては具体的に何をさせるか次回以降に見ていきましょう。