目次なぜ Varnish Cache なのか....................................................................... 2
どのようなときに使用するか..................................................................... 3
静的コンテンツの配信.......................................................................... 3
動的コンテンツの配信.......................................................................... 5
Varnish を使うための環境........................................................................7
Varnish のインストール........................................................................... 7
まずは動かしてみよう............................................................................. 8
Varnish の設定について........................................................................... 9
VCL について....................................................................................... 12
基本的な言語仕様............................................................................. 12
Varnish の基本動作ステップ................................................................21req.*の内容が bereq.*に転記されるタイミング.......................................27
簡易版アクションフロー図..................................................................28
起動時オプションについて...................................................................... 29
Varnish のデバッグ............................................................................... 32
応用的な使い方.................................................................................... 36
管理コンソールの利用方法..................................................................36
インライン C.................................................................................... 38
統計情報の見方................................................................................ 39ストレージサイズと TTL の決め方.........................................................42
ヒット率の上げ方............................................................................. 43
Edge Side Includes (ESI)..................................................................44
gzip の利用..................................................................................... 47
VMOD の追加の仕方.......................................................................... 49
ストレージの高度な制御.....................................................................50
バックエンドの高度な利用..................................................................51
varnishtest の使い方......................................................................... 51
Varnish にやさしい ban の仕方............................................................54
Tip's.................................................................................................. 55
Appendix........................................................................................... 57
あとがき............................................................................................. 641

Varnish にやさしい ban の仕方
ban は実行されたタイミングで即削除を行わず、リストに ban の条件式を登録します。そして lookup、もしくは実際の削除を行っているスレッド(ban lurker thread)が定期的に見て回り、式が True になったものがあれば削除を行います。
ここで以下の ban について考えてみましょう。
ban req.http.host == "example.net" && req.url ~ "^/image/"

リクエストの host と url を評価しています。リクエストの変数(req.*)が生成されるのはリクエストを受けたときだけです。つまりこの ban が実行されるのはlookup されるときにしか行われません。条件に合うリクエストが来るまでリストに残ります。ほんの数件であれば問題ないのですが大量にリストされていると、パフォーマンスに影響が出てきます。何とかして 削除しているスレッドに回収させたいのですが、そのためには req を使わない方法でないといけません。

そこで以下の方法でキャッシュを表す obj 変数を使うことで回避可能です。
vcl
sub vcl_fetch{set beresp.http.X-URL = req.url;
set beresp.http.X-HOST = req.http.host;}
banban obj.http.X-HOST == "example.net" && obj.http.X-URL ~ "^/image/"

vcl_fetch で beresp に.X-URL/HOST を入れているのは、obj 変数が berespの情報を維持する為です。beresp には.url は存在しませんし、レスポンスには通常は Host ヘッダ含まないため、beresp.http.host もありません。しかし req 変数を使わないためにはその上方が必要なため.X-URL と.X-HOST に退避しています。
こうすることで obj で url と host を指定できます。実際に実行してみた結果です。
PID USERPR NI VIRT RES SHR COMMAND
15734 varnish 20 0 440m 18m 988 varnishd15734 varnish 20 0 504m 78m 1208 varnishd15734 varnish 20 0 504m 78m 1244 varnishd15734 varnish 20 0 444m 20m 1300 varnishd//起動状態//56M ファイルをキャッシュ//req.*で ban して数秒後//obj.*で ban して数秒後最初の56 MB のファイルをキャッシュの際しかアクセスしていませんが obj で banすると回収されるのがわかります。

なお、レスポンスヘッダには.X-URL と.X-HOST が含まれます。必要ない場合はvcl_deliver で unset してください。
また、obj.*変数の詳細については Appendix を参照ください54