46. これだけで有効になります。
そしてコンテンツ側の記述ですが以下のように記述します。
<esi:include src=”path” />
指定したパスを展開します。
/index.html
<html>
<body>
↓<br />
<esi:include src=”/esi/1.html” />
↑<br />
</body>
</html>
/esi/1.html
Hello ESI!<br />
上記を実際にみると
<html>
<body>
↓<br />
Hello ESI!<br />
↑<br />
</body>
</html>
と返却されます。
<esi:remove>~</esi:remove>
ESI 実行時に削除される範囲です。タグで囲まれた範囲を削除します。
つまり ESI が有効でない場合にそのまま表示されます。<esi:XXXX>といった記
述は特に HTML の表示に悪影響はないので一時的に ESI を止めてる時にメッセージ
を出すときに利用します。
記述
→<esi:remove>hoge</esi:remove>←
ESI 有効時
→←
ESI 無効時
→<esi:remove>hoge</esi:remove>←
45
47. <!--esi ~ -->
ESI 処理が行われた際に表示される項目です。無効時はコメントのままです。
記述
→<!--esi hoge -->←
ESI 有効時
→ hoge ←
ESI 無効時
→<!--esi hoge -->←
ESI の規格では他のタグも存在するのですが Varnish がサポートしているのは以上
の記述のみです。
また、ESI 利用時の注意事項について説明します。
デフォルトでは HTML/XML タグ形式ではないと解釈されない
include の例できちんと<HTML>~と記述しましたが例えば内容を include のみ
にした場合は動作しません。どうしても動作させたい場合は起動パラメータで設定を
行います
-p esi_syntax=0x00000001
このオプションを指定するとタグが存在しなくても ESI の構文を探します。
ネストするページで<html>や<body>を出力するとそのまま出力される
ESI では特に中身について変更を行わず単純に埋込みを行います。つまり include
元と先で両方共<html>や<body>タグがあると両方共出力されてしまいます。
ネスト数は制限がある
ESI した先でさらに include の記述があってもネストすることはできますが
デフォルトでは最大ネスト数は5です。変更したい場合は起動パラメータで以下の
ように指定します。
-p max_esi_depth [最大ネスト数]
なおネスト制限に引っかかって展開されない場合でも include はそのまま残るわけ
ではなく削除されます。
ページの ESI 化を行う際は再起動かページの ban を行うのが望ましい
詳しくは gzip で解説しますが、Varnish が ESI のタグを解釈するのは fetch した
時なので既にキャッシュされている場合はキャッシュが消えるまではそのオブジェク
トを ESI せずにそのまま返却します。
46
58. Appendix
アクションフロー図詳細
Request received
RESTART Dissect request
vcl_recv() req.
lookup pipe error
vcl_hash() req. Filter req.->bereq. ERROR
hash
obj in cache ? req.
vcl_pipe()
create if not bereq.
no yes pipe error
pass filter req.->bereq. obj.f.pass ? ERROR
send bereq.
no
pipe until close
req. req.
vcl_miss() yes vcl_hit()
bereq. obj.
error restart pass pass error restart
ERROR RESTART deref obj. ERROR RESTART
filter req.->bereq.
fetch
req.
vcl_pass()
bereq.
pass restart error
create anon object RESTART ERROR
fetch hdr
from backend deliver
(find obj.ttl)
req.
vcl_fetch() bereq.
beresp.
restart hit_for_pass error
RESTART obj.f.pass=true deliver ERROR
stream ? ERROR
no
fetch body
yes vcl_error() resp.
from backend
deliver
Filter obj.->resp.
vcl_deliver()resp.
deliver
error restart deliver
streaming
Send body ERROR RESTART
fetch/deliver
Request completed
57
59. 各アクションの際に指定できるリターン値
アクション(vcl_*)
return値 recv pipe pass hash miss hit fetch deliver error init fini
error x x x x x x
pass x x x x
hit_for_pass x
pipe x x
lookup x
restart x x x x x x
hash x
fetch x
deliver x x x x
ok x x
vcl_init/fini の動作条件
vcl_init/fini は本文中で解説していませんが VCL がロード・アンロードの際に呼び出
されます。Varnish の再起動などを行い実際に呼ばれるパタンを調べたのが以下です。
vcl_init vcl_fini
/etc/init.d/varnish start x
/etc/init.d/varnish restart x
/etc/init.d/varnish reload x
/etc/init.d/varnish stop
start(cli) x
stop(cli)
vcl.load(cli) x
vcl.discard(cli) x
vcl.use(cli)
vcl_fini が呼び出される条件は明示的に VCL が破棄されるタイミングのみです。
VCL で利用する各型を STRING に変換する関数
型名 関数名
IP VRT_IP_string
INT VRT_int_string
BYTES
VRT_double_string
DURATION
TIME VRT_time_string
BOOL VRT_bool_string
BACKEND VRT_backend_string
第一引数に sp 指定、第二引数に変換したい値を指定する。
58
62. アクション
型名 recv pipe pass hash miss hit fetch deliver error init fini 説明
IP R R R R R R R R R R R クライアントのIPアドレス
STRING RW RW RW RW RW RW RW RW RW RW RW クライアントの識別子client directorで使う
IP R R R R R R R R R R R サーバのIPアドレス
STRING R R R R R R R R R R R サーバのホスト名
STRING R R R R R R R R R R R サーバの識別子(起動オプション-iで指定)
INT R R R R R R R R R R R サーバのLISTENポート
STRING RW RW RW RW RW RW RW RW RW RW RW リクエストメソッド
STRING RW RW RW RW RW RW RW RW RW RW RW リクエストURL
STRING RW RW RW RW RW RW RW RW RW RW RW HTTPプロトコルバージョン
HEADER RW RW RW RW RW RW RW RW RW RW RW HTTPヘッダ
BACKEND RW RW RW RW RW RW RW RW RW RW RW このリクエストを処理するバックエンドを指定
INT R R R R R R R R R R R このリクエストを処理するときに何回restartしたか
INT R R R R R R R R R R R ESI処理時の階層
DURATION RW RW RW RW RW RW RW RW RW RW RW 有効期間を上書きする
DURATION RW RW RW RW RW RW RW RW RW RW RW 猶予時間を上書きする
DURATION RW RW RW RW RW RW RW RW RW RW RW 保持時間を上書きする
STRING R R R R R R R R R R R リクエストのユニークなID
BOOL RW RW RW RW ESI機能の有効・無効化
BOOL R R R R R R R R R R R クライアントがgzip転送を許可しているか
BOOL R R R R R R R R R R R 現在選択されているバックエンドが正常かどうか
BOOL RW キャッシュ検索しているビジーなオブジェクトを無視するか
BOOL RW 強制的にこのリクエストをキャッシュミスにするかどうか
STRING RW RW RW RW リクエストメソッド
STRING RW RW RW RW リクエストURL
STRING RW RW RW RW HTTPプロトコルバージョン
HEADER RW RW RW RW HTTPヘッダ
DURATION RW RW RW バックエンドに接続する際のタイムアウト時間
DURATION RW RW バックエンドから最初のバイトが転送される際のタイムアウト時間
DURATION RW RW 通信中に一時的に受信が待ったときのタイムアウト時間
STRING RW HTTPプロトコルバージョン
DURATION W セイントモードを有効にするか
INT RW HTTPステータスコード
STRING RW HTTPステータスコード文字列
HEADER RW HTTPヘッダ
BOOL RW ESI処理を行うか
BOOL RW ストリームを有効にするか
BOOL RW gzip圧縮するか
BOOL RW gzip解凍するか
DURATION RW オブジェクトの有効期間
DURATION RW オブジェクトの追加の猶予時間
DURATION RW オブジェクトの追加の保持時間
STRING RW 使用したバックエンドの名前
IP R 使用したバックエンドのIPアドレス
INT R 使用したバックエンドのポート
STRING RW キャッシュを格納するストレージの名前を指定
STRING RW RW HTTPプロトコルバージョン
INT RW HTTPステータスコード
STRING RW HTTPステータスコード文字列
INT R R オブジェクトをレスポンスした回数、0はキャッシュミスを表す
HEADER R RW HTTPヘッダ
DURATION RW RW オブジェクトの有効期間
DURATION RW RW オブジェクトの追加の猶予時間
DURATION RW RW オブジェクトの追加の保持時間
DURATION R R R オブジェクトが最後に使われてからの秒数
STRING RW HTTPプロトコルバージョン
INT RW HTTPステータスコード
STRING RW HTTPステータスコード文字列
HEADER RW HTTPヘッダ
TIME RW RW RW RW RW RW RW RW RW RW RW 現在時間(epoch)
BYTES R R R R R R R R R R R 指定ストレージの空き容量
BYTES R R R R R R R R R R R 指定ストレージの使用容量
BOOL R R R R R R R R R R R おそらく正常かどうかだと思うが不明
灰色部の init/fini において、各変数は定義上利用可能でしたが、
確認した限り、指定すると Varnish がクラッシュしました。
必ず確認してから使って下さい。
61