unoh.github.com

Varnish上でESIの機能を利用する

Mon Feb 21 18:17:33 -0800 2011

Keita です。

サンフランシスコで開かれたSymfony Liveで、Fabien Potencier氏によるHTTP Cacheという発表がありその中でESI(Edge Side Includes)の紹介がありました。

下の画像はちょっとみずらいですが、たとえばこのラボブログのレイアウトだと大枠の部分は常によりユーザに使いフロントの所(つまりCDNやキャッシュサーバ)側でキャッシュされていてAの部分とBの部分それぞれのコンテンツを別々にインクルードする形でキャッシュ制御することができます。

esi.png

Symfony2のサイトsymfony-reloaded.orgでも、マニュアルがありますので、詳細はそちらを参考にしていただくとして、その中に、Varnishでもその機能が利用できることが紹介されていますので試してみたいと思います。

Varnishのインストールについては省略してとりあえず設定部分から。VarnishサイトにあるESIの説明あたりを参考にして下記のような環境を構築してみました。

Apache側(port: 10080でアクセス可能)

himote.html
<html>
<head>
himote:
</head>
<body>
<esi:include src="/time.php" />
</body>
</html>
time.php
<?php
echo date('Y/m/d h:i:s');

varnish側(port: 6081でアクセス可能)

default.vcl
backend default {
  .host = "127.0.0.1";
  .port = "10080"; // Apache
}

sub vcl_fetch {
    if (req.url == "/himote.html") {
            esi; // enable ESI
    }
}
wget で確認
wget http://localhost:6081/himote.html -O -

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:07:37
</body>
</html>

# 二回目
wget http://localhost:6081/himote.html -O -

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:07:37
</body>
</html>

2回目も時間がかわってないことから、正常にキャッシュしているようです。
ただ、キャッシュの有効期限を設定していないので今度はExpireヘッダを出力してみます。

<?php
$expire = 10; //10秒後
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + $expire));
echo date('Y/m/d h:i:s');
動作確認
wget http://localhost:6081/himote.html -O -

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:13:47
</body>
</html>

wget http://localhost:6081/himote.html -O -
<html>
<head>
himote:
</head>
<body>
2011/02/22 11:13:57
</body>
</html>

何回かアクセスするとちょうど10秒目くらいに時間が変更されているので正常に動作しているようです。

本家のマニュアルを写経した程度になってしまいましたが、どのようなものかイメージをつかんでいただけたのではないでしょうか。実際にプロダクトレベルで利用するにはベンチマークやログなどの詳細な検証は必要になると思いますのでご注意ください。

本記事がご参考になれば幸いです。