monolithic kernel

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

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

インストール

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

Terminal window
sudo aptitude install varnish

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

Terminal window
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で記述します。

Terminal window
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コマンドを使うのが現実的だと思います。

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