Varnish で使える ESI(Edge Side Includes)

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 のドキュメント]にもっと詳しく説明があります。

Published by in Linux, Web 技術, インストール, オープンソース, スケーラビリティ and リバースプロキシ using 129 words.