Varnishの設定 その2
各ブロックの役割続き
前回に続き、残りのブロックにつき見ていきます。
vcl_pipe : Varnishを通過させる際の処理
vcl_pass : Varnishでキャッシュさせない時の処理
vcl_hit : キャッシュにヒットした時の処理
vcl_miss : キャッシュにヒットしなかった時の処理
vcl_error : 各種エラーの時の処理
vcl_deliver : コンテンツを送信する際の処理
vcl_pass
キャッシュを行わない通常のプロキシとして動作します。 リクエストヘッダおよびレスポンスヘッダの操作が可能です。
vcl_pipe
何らかの理由でvcl_passが上手く動作しない場合やRFC2616で定義されているMETHOD以外を取り扱う場合に利用します。
pipeを行った場合、バックエンドへの初回リクエスト時にはX-Forwarded-Forが付与されますが、パイプの再利用時には付与されません。
アプリケーションによっては不具合を起こす原因となりますので、使用する場合は
set req.http.connection = "close";
を設定することにより1回ごとに接続を切断し、毎回X-Forwarded-Forを付けることが可能です。
vcl_hit
キャッシュにヒットした時、何かしらの処理を加えたい場合に使用します。
vcl_error
エラーが起きた場合に表示させる内容を設定します。 エラーページはこのブロックの中に全てのHTMLコードを記載する必要があります。 Varnish自身が通常のHTTPサーバとして動作することはできませんので、 Varnish単体では画像を使ったり、凝ったエラーページを出力することはできません。
vcl_deliver
レスポンスに対して何かしらの処理を加えたい場合に設定します。 一般的に、余計や情報の削除や検証用に情報を表示するために下記のように設定します。
if ( client.ip == "xxx.xxx.xxx.xxx") {
# Varnishの情報を追加
if(!resp.http.X-Served-By) {
set resp.http.X-Served-By = server.identity;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
}
else {
set resp.http.X-Cache = "MISS";
}
set resp.http.X-Cache-Hits = obj.hits;
}
else {
set resp.http.X-Served-By = regsub(resp.http.X-Served-By, "$", ", ");
set resp.http.X-Served-By = regsub(resp.http.X-Served-By, "$", server.identity);
if (obj.hits > 0) {
set resp.http.X-Cache = regsub(resp.http.X-Cache, "$", ", HIT");
}
else {
set resp.http.X-Cache = regsub(resp.http.X-Cache, "$" , ", MISS");
}
set resp.http.X-Cache-Hits = regsub(resp.http.X-Cache-Hits, "$", ", ");
set resp.http.X-Cache-Hits = regsub(resp.http.X-Cache-Hits, "$", obj.hits);
}
}
else {
# 不要な情報を削除
unset resp.http.Via;
unset resp.http.X-Varnish;
unset resp.http.X-Served-By;
unset resp.http.X-Cache;
unset resp.http.X-Cache-Hits;
}
最後に
Varnishでページのキャッシュを行わせること自体は非常に簡単です。
しかし実際の設定ではキャッシュ対象とするサイトの仕様に合わせたり、キャッシュしやすいようにサイト側の設計を行ったりと、連携を行うことが必須です。
弊社ではeZ Publishを主体とし、CMSへのキャッシュとしてVarnishを活用しています。