VarnishではじめるESI 2012/03/29 いわなちゃんさん(@xcir)
VarnishではじめるESI
2012/03/29いわなちゃんさん(@xcir)
自己紹介
● いわなちゃん(さん) (@xcir)● ソーシャルゲームをやってる会社で
VarnishやらC#やらPHPやったり
● 六本木にいます● アルパカが好きです
● 会場がCAなのでアメーバ水が欲しいです!!
絡んでくれると喜びます!
キャッシュって要は静的コンテンツしか適用できないよね?
CSSとかJavascriptとか画像とか・・・
キャッシュって要は静的コンテンツしか適用できないよね?
いいえ(半分)違います。
そもそも静的コンテンツってなんだろう
HTML1枚のページ?
画像?
CSS?
そもそも静的コンテンツってなんだろう
LLで生成したページは動的?静的?
動的?静的?
ブログ名を変更するまで
静的
管理ページで変更するまで
静的
新しい投稿があるまで静的
新しい投稿があるまで静的
動的?静的?
実は多くの動的とされているコンテンツは静的コンテンツの
組み合わせが多い
動的?静的?ログインユーザごとに静的
動的?静的?
やっぱり静的の組み合わせ
動的?静的?
+
+ +
Aさんの要求するページ
+ +
Bさんの要求するページ
+ +
動的?静的?
ユーザによって出る内容が違うのなら
ページをキャッシュ出来ない?
動的?静的?
こういう場合はプログラム側でキャッシュしたりして組み立てたり
することが多いです(Memcacheとかで)
ESI! ESI! ESI!
ページ全体でキャッシュできないのなら
要素ごとにキャッシュすればいいじゃない!
ESIとは(Edege Side Includes)
2001年にAkamaiやOracleなどが策定Webページの要素を動的に構成する仕組み
http://www.w3.org/TR/esi-lang
特殊なタグをコンテンツに埋め込んで使う
<esi:include src=”url”>指定URLからコンテンツを取って埋め込む
などなどVarnishは一部のタグのみサポートしてます
VarnishでESI!
Aさんの要求するページ
Bさんの要求するページ
要素を結合
VarnishでESIを使ってみよう
default.vcl------------------------------------------backend default{ .host="localhost"; .port="81";}
sub vcl_fetch{ set beresp.do_esi = true;}
esi.html------------------------------------------<html><body>20sec <esi:include src=”/a.php”>2sec <esi:include src=”/b.php”></body></html>
a.php------------------------------------------<?php header('Cache-Control: max-age=20');?><div><?php echo date('Y/m/d H:i:s');?></div>
b.php------------------------------------------<?php header('Cache-Control: max-age=2');?><div><?php echo date('Y/m/d H:i:s');?></div>
これだけで有効に
VarnishでESIを使ってみよう
Apache直Varnish経由
20secと2secの時刻がずれているのでキャッシュされているのがわかる
ねっ
簡単でしょ?
VarnishでESIを使う理由
今回のは明示的にmax-ageを指定しましたが実際はテンプレートで
キャッシュ時間を指定したい!(こんな感じで)
esi.html------------------------------------------<html><body>20sec <esi:include src=”/a.php?ttl=120s”>2sec <esi:include src=”/b.php?ttl=10s”></body></html>
などなど細かい制御が容易なVarnishがおすすめ!
VCLで拾ってTTL設定も簡単
ESIは銀の弾丸ではない
素晴らしいESIですが入れれば即100倍界王拳とは行きません
たとえばキャッシュができないコンテンツ(携帯での広告)
極端に更新間隔の短いコンテンツetc...
いろいろ適用が難しい場合もあります
キャッシュの一つの手段として考えてもらえば幸いです
VarnishでESIで使う際の注意
ESIの解釈が行われるためにはコンテンツの最初が「<」で始まる必要があります
もしこれ以外で行いたい場合は起動パラメータに
-p esi_syntax=0x00000001を付与してください
VarnishでESIで使う際の注意
ユーザー毎に出しわけをする要素を含む場合は
必ずvcl_hashでその値を追加してくださいでないと全てのアクセスで
同じ結果が出るという悲しい事態に・・・
Varnishはオブジェクトを特定するのにHashを使いますそのHashを生成するキーにユーザIDを含めるようなイメージです(クッキーから抽出とか)
VarnishでESIで使う際の注意
ESIの要素が複数ある場合今のバージョンのVarnishでは並列ではなく逐次取得します
(将来は対応するみたいです)
VarnishでESIで使う際の注意
ESIはセッションワークスペースをたくさん使用します
そのためデフォルト値(64k)では足りない可能性があるので大きめに指定すると良いです
例えば5MBとか指定しても100KBしか使わなければ実使用サイズは100KBです
VarnishでESIで使う際の注意
ESIの要素がエラーでアクセス出来ない場合に
こうならないようにエラー時の挙動を
制御したほうがよいです
VarnishでESIで使う際の注意
default.vcl------------------------------------------import std;backend default{ .host="localhost"; .port="81";}
sub vcl_fetch{ if(beresp.status>=400){ error(beresp.status); } set beresp.do_esi = true;}sub vcl_error{ synthetic std.fileread("/tmp/hoge.txt"); return(deliver);}
/tmp/hoge.txt------------------------------------------もう眠いです(:3[__])
たとえばこんな感じでエラーを埋め込むとか(VCL内でマルチバイト文字を入れると化けます)
ご清聴ありがとうございました