monolithic kernel

Varnishでコンテンツをキャッシュして高速化

高速なリバースプロキシであるVarnishを導入してWebアプリケーションの高速化を図ります。

インストール

Ubuntu 10.04であればaptでインストール可能です。

sudo aptitude install varnish

daemontoolsで管理するのであれば以下のようにします。

sudo service varnish stop
sudo update-rc.d -f varnish remove
cd /etc/service
sudo mkdir varnish
sudo vi varnish/run
chmod +x varnish/run
#!/bin/sh
exec /usr/sbin/varnishd \
  -F \                                    # フォアグラウンドで動作
  -a :6081 \                              # 待ち受けポート
  -T localhost:6082 \                     # 管理用ポート
  -f /etc/varnish/config.vcl \            # 設定ファイル
  -S /etc/varnish/secret \                # 管理ポートの認証ファイル
  -s file,/var/lib/varnish/cache.bin,10M  # データの保存先とサイズ

設定

Varnishの設定はVCL(Varnish Configuration Language)というDSLで記述します。

sudo vi /etc/varnish/config.vcl
// バックエンドの設定
backend app {
    .host = "127.0.0.1";
    .port = "9000";
    .connect_timeout = 30s;
}

// リクエスト開始時に呼ばれる
// どのように処理を行うかを記述する
sub vcl_recv {
    // app に処理を行わせる
    set req.backend = app;
    // キャッシュを利用する
    return (lookup);
}

// backendからデータを取得できたときに呼ばれる
sub vcl_fetch {
    // データの有効期限を1日に設定する
    set beresp.ttl = 86400s;
}

// データを識別するための値を計算するときに呼ばれる
sub vcl_hash {
    // 携帯電話とPCで違うページを表示させる例
    // リクエストのURI
    set req.hash += req.url;
    if (req.http.User-Agent ~ "DoCoMo|KDDI|SoftBank|Vodafone") {
        // 携帯電話からのアクセスの場合、末尾にmobileを加える
        set req.hash += "mobile";
    } else {
        // PCからのアクセスの場合、末尾にpcを加える
        set req.hash += "pc";
    }
}

管理ツールの利用

専用のvarnishadmコマンドかtelnetを利用すると管理用ポートに接続して処理を行うことができます。ただ、telnetを使う場合は認証を無効にしないと面倒なのでvarnishadmコマンドを使うのが現実的だと思います。

sudo varnishadm -T localhost:6082 -S /etc/varnish/secret
purge.url ^/quit