Fastly - MT と Fastly を連携させるプラグイン

  • 投稿日:
  • by
  • カテゴリ:

Movable Type と Fastly を連携させるための Fastly というプラグインを公開しました。

mt-plugin-Fastly

このプラグインを使うと認証を必要としないパブリックな Data API のレスポンスをキャッシュさせることができます。これにより先頃から AWS で利用できるようになった t2.nano でも、Data API をフロントエンドで利用しているサイトを運用することも可能になります。(なると思います)

また昨年公開した mt-plugin-DataAPIFormatPHP とあわせて使えば、外部のサイトから PHP で以下のように MT のデータにアクセスをしても、現実的な速度で動作するようになります。(なると思います)

このブログは Fastly と mt-plugin-Fastly を使って運用されています。

できること

  • MT でコンテンツを更新した際に、対応する Fastly のキャッシュを即時にクリアすることができます
    • 記事、ウェブページ、アイテム、の全てに対応しています
    • ダイナミックパブリッシングにも対応しています
  • 管理画面 (mt.cgi) と、認証付きの Data API (mt-data-api.cgi) を Fastly でキャッシュされないようにします
  • 認証なしの Data API の結果をキャッシュさせ、かつコンテンツを更新した際に即時にクリアすることができます
    • mt-search.cgi の検索結果についても同様にキャッシュ、クリアすることができます
    • キャッシュのクリアを非同期に処理させることもできます
  • テンプレートモジュールを ESI で処理させることができます
    • これにより、スタティックパブリッシングでもページ内の部分的な更新が可能になります
    • (ダイナミックパブリッシングでは未対応です)
  • PURGE リクエストに任意のヘッダーを指定することができます
    • リクエストヘッダーでアクセス制限をかけている場合に、プラグインの設定で認証情報を追加することができます。(Fastly 側の設定例)

ESI について

ESI は耳慣れない言葉かもしれないので、簡単に補足します。(私も詳しくはありません)

ESI は Edge Side Includes の略で、CDN やキャッシュサーバーの層で include の処理をさせるための仕様です。つまり ESI を使うと、(静的な内容ではありますが) PHP の include や、SSI の #include あるいは、Web Components のようなことを、CDN やキャッシュサーバーの層で行わせることができるようです。

Fastly では (2015年12月現在) バックエンドでは varnish (2.1) を利用しているとのとこで、varnish の ESI に関するドキュメント の機能を利用することができるようです。esi:remove はあまり利用することはないと思うので、実質的には「esi:include のみが利用できる」というところだと思います。

Fastly で ESI を利用するために必要なこと

Fastly で ESI を利用するためには、custom VCL. を使って有効にする必要があります。この custom VCL. の機能は登録直後は利用できず、サポートにメールをして有効にしてもらう必要があり、英語が苦手(私は苦手です)な場合には若干敷居が高いです。が、おそらく特別な審査があるということではなく、私は「custom VCL」「request」を含んだ2行くらいのメールを送ったところ数時間程度で有効にしてもらえたので、基本的にはお願いすればすぐに使えるようになるものだろうと思います。

costom VCL が設定できるようになったら、以下の VCL をアップロードすれば ESI を利用できるようになります。

もう少し細かいところについては「How do I enable basic ESI in my VCL?」などを参照するとよいと思います。

プラグインのインストール

  1. GitHubからzipファイルをダウンロードしてください。リリース一覧
  2. ダウンロードしたファイルを展開してください。
  3. pluginsディレクトリにアップロードしてください。

    インストール後のディレクトリの配置は以下のようになります。

    $MT_HOME/
        plugins/
            Fastly/

Getting sterted (とりあえず使ってみる)

とりあえず使ってみるだけであれば、難しい設定は必要ありません。

Fastly

  • 公開サイトを Fastly 経由で配信されるようにする

MT

  • プラグインをインストールする
  • 「ブログのプラグイン設定」を開き、「有効」のチェックボックスにチェックを入れて更新する

以上の設定を行うだけで、以下の機能が有効になります

  • 記事やアイテムの更新のタイミングでキャッシュがクリアされる
  • 認証が必要な Data API がキャッシュの対象から外される
  • mt.cgi に関しては全てキャッシュの対象から外される

ESI を使う

ESI を使う場合にも特別な設定は必要ありません。以下の手順で利用することができます。

  1. ブログの「全般設定」を開き、「モジュール設定 > サーバーサイドインクルード」で「Edge Side Includes」を選択して保存する
  2. ESI でインクルードしたいテンプレートモジュールを開き「ESIのインクルードとして処理する」にチェックをいれて保存する

以上の準備ができていると、インデックステンプレートやアーカイブテンプレートから mt:Include[module="module-name"] でそのモジュールを呼び出した場合に、ESI で処理されるようになります。

ESI を使うとどんなことが実現できるか

  • スタティックパブリッシングを使いながら
  • PHP や SSI などサーバー上の仕組みに頼ること無く
  • MT の作法で mt:Include を書くだけで
  • 全てのページに埋め込まれるようなモジュールを、全体を再構築すること無く
  • 通常の記事の更新に合わせて全てのページで更新する

ということができるようになります。

Data API や検索結果のキャッシュをクリアする

Data API や検索結果のキャッシュをクリアする場合には、Fastly の API キー等を設定する必要があります。

MTの設定

  1. mt-config.cgi に、FastlyAPIKey という名前で Fastly の API キーを追加する
  2. 「ブログのプラグイン設定」を開き、「Service」の欄に Fastly の管理画面で表示されている ID を入れて更新する

以上の設定を行うと、ブログ記事やアイテム、またはテンプレートなどの更新時に Data API や検索結果のキャッシュがクリアされるようになります。

サポートしている出力タイプ

  • スタティックパブリッシング
  • ダイナミックパブリッシング
    • ESI には未対応です

動作環境

  • MT6

この記事について

この記事は Movable Type Advent Calendar 2015 の21日目の記事です。