一部の人に鳥の人として認識されているyamaokaです。
フォト蔵では最近Varnishをコンテンツキャッシュに利用しています。 具体的には、写真のサムネイルなどの静的なコンテンツをキャッシュするために使っていたりします。
Varnishはコンテンツキャッシュ機能を備えたHTTPアクセラレータです。 同じような目的に使われるプロダクトとしてSquidがありますが、 それよりも高速に効率よく動作することを売りにしています。
サーバーへのインストールについてはCentOSなどRed Hat系のLinuxであれば EPELからrpmを入手するか、 ソースを展開するとredhatディレクトリにspecファイルが用意されているので そちらを利用すれば最新版のrpmが作成可能です。
以下、rpmを使ってインストールしたものとして話を進めます。 起動設定は/etc/sysconfig/varnishです。初期設定では次のような起動設定になっています(一部抜粋)。
DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-u varnish -g varnish \
-s file,/var/lib/varnish/varnish_storage.bin,1G"
フォト蔵ではいろいろと変更して次のような設定になっています(一部抜粋)。
DAEMON_OPTS="-a :6081 \
-T <自分のIPアドレス>:6082 \
-f /etc/varnish/images.vcl \
-u varnish -g varnish \
-p thread_pools=4 \
-p thread_pool_min=200 \
-p thread_pool_max=4000 \
-p thread_pool_add_delay=2 \
-p listen_depth=4096 \
-p ping_interval=2 \
-p lru_interval=20 \
-p srcaddr_ttl=0 \
-s file,/path/to/cache/varnish_images_cache.bin,10G \
-h classic,500009"
-Tで指定できるのは管理機能へのインタフェースを提供するIPアドレスとポートです。 自分のIPアドレスを明示的に指定することで、外部から管理機能にアクセス可能になります。 また、Nagiosなどを利用して簡単な死活監視を行うこともできるようになります。
キャッシュを10GBと大きめに取っていますが、これは画像ファイルをキャッシュするためです。 HTMLなどのテキストデータであればもっと小さくていいと思います。
Varnishのチューニングについてはなかなかweb上で記事が見つからなかったりするのですが、 次に挙げるページがいろいろと参考になるかと思います。
- Performance - Varnish
- High-end Varnish-tuning « Kristian's web log
- Varnish best practices « Kristian's web log
- Is anyone using ESI with a lot of traffic?
Varnishの設定ファイルはVCLというドメイン特化言語で記述します。 フォト蔵の場合、実際の設定である/etc/varnish/images.vclは次のようになっています(一部改変して抜粋)。
backend web1 {
.host = "<バックエンドのサーバーのIPアドレス>";
.port = "80";
.connect_timeout = 30s;
}
sub vcl_recv {
set req.backend = web1;
if (req.url ~ "_org") {
pass;
}
lookup;
}
フォト蔵では写真のオリジナル画像のファイル名に「_org」が含まれています。 容量の大きいそのファイルはキャッシュせず、それ以外のファイルをキャッシュするような設定です。 このようにVCLはわかりやすい記法で、柔軟に設定を行うことが可能になっています。 前述の例ではバックエンドのサーバーは1つだけですが、URLに応じて異なるバックエンドサーバーを利用したり、 複数のサーバーをバックエンドとして利用することも可能になっています。
Varnishにはロギングのためのvarnishlogや 統計情報を閲覧するためのvarnishstatといった便利なツールが用意されており、 比較的扱いやすいプロダクトかなと思います。
国内でもだんだんとVarnishの使用例が増えてきているようですが、 実際の運用方法とか設定例の情報はまだまだ少ないのが現状かと思います。 すこしでもVarnish導入の手助けになれば幸いです。
追記: 「IP」という表記は正確ではないため、「IPアドレス」という表記に変更しました。