ESI(Edge Side Includes) って知ってますか?ESI は SSI(Server Side Include) を拡張したようなもので、タイトルには「Varnish で」と書いていますが、W3C が承認している規格なのでもちろんどのサーバでも実装さえしていれば利用できます。
ESI とは何か?
ESI を使うと HTML にあるサイドバー(右や左)やヘッダー、フッター、中身のコンテンツ(記事等)をそれぞれ別々の URL として取得することができます。ESI は例えば以下のように使います。
<HTML>
<BODY>
The time is: <esi:include src="/cgi-bin/date.cgi"/>
at this very moment.
<esi:include src="http://www.example.com/ad.html" />
</BODY>
</HTML>
このようにしておくと /cgi-bin/date.cgi からコンテンツを取得し “The time is: " の後に挿入されます。
これはこの後の http://www.example.com/ad.html でも同様です。
重要なのはこの /cgi-bin/date.cgi(外部ドメインも可能です)と http://www.example.com/ad.html はそれぞれ別々にキャッシュされ、それぞれキャッシュの有効期限を持つ為、本当に更新が可能なコンテンツのみが取得されるようになります。
Varnish で対応している ESI
この規格は Akamai や Oracle から仕様化が進んだようで Akamai 等ではもちろん対応しており、Varnish では機能が限定的な対応になっています。Varnish で利用可能な ESI 機能は以下の通りです。
- esi:include
- esi:remove
- <!- esi … ->
esi:include は既に説明した通りです。esi:remove と <!- esi … -> は例えば以下のような内容があるとします。
<esi:remove>
<a href="http://www.example.com/LICENSE">The license</a>
</esi:remove>
<!--esi
<p>The full text of the license:</p>
<esi:include src="http://example.com/LICENSE" />
-->
まず、esi:remove ですが、Varnish 側で ESI 処理が行われた場合に esi:remove 内のコンテンツを削除します。これによってこの箇所は ESI が処理された場合は表示されなくなります。ESI 処理が行われない場合はそのまま表示されるため、ブラウザに依存しますがこの箇所(2行目)が表示されます。
また、<!- esi .. -> も似たような概念で Varnish 側で ESI 処理が行われる場合に、この “<!- esi” と “->” が削除される為、5〜6行目だけが残るようになります。ESI が処理されない場合は “<!- esi” と “->” が残る為、ブラウザでは 5〜6行目がコメントアウトされた形となり表示されなくなります。
このあたりは [Varnish のドキュメント]にもっと詳しく説明があります。