使える!サーバ運用の実践テクニック

第13回[キャリアアップ編④]varnishを使おう③─便利な機能を使いこなす

第11回第12回とvarnishを利用したコンテンツ配信の概要を記載してきましたので、今回は、varnishの論理的な定義ということで、各種パラメータや、運用で使えそうな機能を紹介しておきたいと思います。

基本操作

varnishの基本的な操作は、以下のコマンドで一通り網羅されます。

起動
/etc/init.d/varnish start
停止
/etc/init.d/varnish stop
ステータス確認
varnishstat
管理画面
varnishadm -T localhost:6082 -S /etc/varnish/secret
ログ(Apache形式)
/usr/bin/varnishncsa -D -P /var/run/varnishncsa.pid -c -a -w/var/log/varnish/access.log

定義関係

varnishの定義関連は、起動パラメータとコンフィグの2つを知っておけばほとんどのことができます。通常利用においてはこれ以上の定義はほとんど必要としません。

起動時に変更する項目

起動コマンドは、

/etc/init.d/varnish start

です。実際に起動する際に読まれるパラメータは/etc/sysconfig/varnishにあり、事前に定義を編集しておくことで、内容に応じた状態で起動することができます。

/etc/sysconfig/varnish

DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -u varnish -g varnish \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/varnish_storage.bin,1G"

実サービスの利用を想定した場合、待ち受けポートを80にしたり、vclファイル名を変更したり、キャッシュサイズを定義することになるかと思います。

キャッシュサイズに関しては、デフォルトで1Gバイトとなっています。最初に起動した際に/var/lib/varnish/varnish_storage.binが作成されます。サイズ指定を変更しながら起動停止を繰り返すと、指定サイズ以上に容量が増えていく傾向にあります。また、起動時にvarnish_storage.binが無かった場合は、指定サイズで作成されます。

キャッシュコントロールを行うためのVCL定義

いくつかサンプルを交えながら紹介します。定義体は/etc/varnish/default.vclにあり、インストール直後に開いてみると、以下の関数がコメントで定義されているかと思います。

backend default
後続サーバを定義します。
director
対象のバックエンドサーバが複数あった場合の振舞いを定義します。
acl clients
アクセスコントロールを実施するべく、対象IPを記載します。
sub
サブルーチンを記載します。よくvarnishの定義(vcl)はC言語の記述に似ているといわれる部分になります。varnishをインストールし、default.vclを開くと以下の9個のサブルーチンがコメントで記載されており、それぞれの内容は以下の通りです(詳細はコメントやリファレンスを参照ください⁠⁠。
sub vcl_recvメインルーチン
sub vcl_pipe該当サーバ内のvarnishを通過する場合
sub vcl_passキャッシュさせない場合
sub vcl_hashhashの生成
sub vcl_hitキャッシュが存在していた場合
sub vcl_missキャッシュが存在しない場合
sub vcl_fetchキャッシュにない場合、バックエンドサーバより取得
sub vcl_deliverコンテンツ送信時の処理
sub vcl_errorエラーが発生した場合
【例1】親子関係の定義
バックエンドサーバを172.20.1.1: 6081とし、30ms以内の返答を期待する。
backend default {
  .host = "172.20.1.1";
  .port = "6081";
  .connect_timeout = 30ms;
}
【例2】URLからコンテンツ振り分け
リクエストURLがwww.test.jpの場合、キャッシュ有無の確認、必要に応じてdefault定義に従ってbackendサーバへ接続する。それ以外のURLであった場合は、⁠400 "Forbidden"」を返信する。
# backend server
    if (req.http.host == "www.test.jp") {
        set req.backend = default;
    }
    else {
        error 400 "Forbidden";
    }
【例3】特定キャッシュの時間変更
リクエストURLがwww.test.jp/test/配下のコンテンツのみ、キャッシュオブジェクトの保存時間を60sとする。
    if(req.url ~ "www.test.jp/test/") {
        set obj.http.cache-control = "max-age = 60";
        set obj.ttl = 60s;
    }

管理画面からの操作(varnishadm)

varnishadm -T localhost:6082 -S /etc/varnish/secret

を入力する事で管理画面を呼び出すことができます。操作方法はコマンドベースの対話式で、使いこなすには慣れが必要です。上記コマンドにて管理モードとし、helpと入力すると以下の通りとなります。

help

200 377    
help [command]
ping [timestamp]
auth response
quit
banner
status
start
stop
stats
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
vcl.show <configname>
param.show [-l] [<param>]
param.set <param> <value>
purge.url <regexp>
purge <field> <operator> <arg> [&& <field> <oper> <arg>]...
purge.list
【例】varnishadm管理モードからできること①:キャッシュ削除の方法
明示的にキャッシュデータを削除する場合は、purgeコマンドを利用します。
削除コマンドのエントリ
purge.url hoge.jp
200 0      
エントリリストの閲覧
purge.list   
200 58     
0x2b9a7471d640 1290682098.382948     0      req.url ~ hoge.jp
【例】varnishadm管理モードからできること②:設定の動的反映
varnishを稼働させたままvcl定義を動的に変更する(varnishadmからの動的反映方法⁠⁠。
vcl.load defaultvcl /etc/varnish/default.vcl
200 13
VCL compiled.

vcl.use defaultvcl
200 0

運用するにあたって

varnishはシンプルな構造より、直感である程度動かすことができますが、まだまだ新しいプロダクトのため、事例で使われる定義などが限定的であったり、ドキュメンテーションなども完全に日本語化されておりません。

vclなどで定義できる宣言、関数やvarnishadmなどでできることに関しては、varnish本家のwikiなどを参照することにより(英語が苦手でも)ある程度利用方法がわかるかと思います。調べ方は、Varnish Wikiより右上のSearchを利用するだけなので、検索結果から求めるものを探すのは大変かもしれませんが、実定義イメージで記載されていたりしますので、検証環境などで試しながらでも十分に理解を深めることができると思います。

おわりに

いかがでしたでしょうか? 第11回、第12回で概要とハードウェア構成を、今回は、実定義を行う上でのさまざまな材料を可能な限りわかりやすく記載してみました。今回説明した内容に関しては、乱暴に言えば、論理的な疎通がとれる定義だけ入っていれば動かすことが可能ですが、本番実サービスで利用する場合はポート等セキュアに設計したり、リクエストURLを解釈して自社サイト、サービス以外であった場合はキャッシュ検索を行う前にエラーを通知するようなレスポンスを返すなどを実現することができますので、いろいろと検証してみてはいかがでしょうか?

おすすめ記事

記事・ニュース一覧