こんにちは。

突然ですが、スマートフォンやPCでネットサーフィンしている時にストレスを感じることは何でしょうか。

種々あるかと思いますが、「ページの読み込み速度が遅い」が1つに挙げられると思います。

では、ページの読み込み速度の改善のアプローチとして何が考えられるでしょうか。

例えば、次のことが挙げられると思います。

  1. サイトで利用している画像等のサイズを落とす
  2. JS・CSSなどの外部ファイル数を減らす(CSS, JSのMinify)
  3. gzip圧縮転送を設定する
  4. Webサーバーのスペックを上げる、またはサーバーの負荷軽減の仕組みを導入する
  5. キャッシュを利用する

上記で挙げた4と5に関しては、CDN(Content Delivery Network)を利用することで対応することができます。

前置きが長くなりましたが、この記事ではDrupalサイトへのCDNサービスの導入について、簡単に紹介させていただきたいと思います。

CDNサービスを利用する利点

CDNを利用することで次のことが期待できると思います。

  • Webサーバー(以下、オリジンサーバーと呼びます)の負荷軽減
  • キャッシュサーバーによるコンテンツ配信の速度向上

上記についてイメージしやすいように、図等を用いて説明したいと思います。

CDNを利用しない場合

閲覧者がWebブラウザからサイトのURLにアクセスした場合、オリジンサーバーにリクエストが集中し、リクエストに対して処理をしてレスポンスする必要があります。仮にロードバランサー等で負荷分散をしていても、オリジンサーバーがすべてのリクエストに対して処理しなければならない状況は変わりません。

結果、オリジンサーバーに負荷がかかり、レスポンスが遅延し、閲覧者からは「ページ読み込みに時間がかかる」と思われてしまいます。 大規模でアクセスの多い人気サイトの場合だと負荷がかかりすぎてサーバーダウンしてしまうリスクがあります。

CDN利用しない場合

CDNを利用する場合

CDNを利用する場合は、オリジンサーバーに閲覧者のすべてのリクエストが行くのではなく、中間にあるキャッシュサーバーが代行する形になります。

キャッシュサーバーは、リクエストされたコンテンツをキャッシュしている場合は、そのページのコンテンツを配信します。したがって、リクエストされたページがキャッシュされていれば、オリジンサーバーへのアクセスは発生しません。

一方で、キャッシュサーバーにキャッシュが存在しないコンテンツのリクエストがあった場合は、オリジンサーバーから取得します。基本的に、1回オリジンサーバーから取得したデータはキャッシュサーバーでキャッシュされます。(意図的にキャッシュさせないコンテンツ等も設定できます)

また、コンテンツを配信するキャッシュサーバーは閲覧者に最も近いPOP(Point of Presence)が選択されるため、素早い通信が期待できます。

キャッシュサーバーにキャッシュがある場合、ない場合の振る舞いは、下記の画像のようになります。

CDN利用する場合

CDNサービスを利用する上での注意点

キャッシュサーバーのおかげで、オリジンサーバーへの負荷軽減、コンテンツ配信速度向上が見込めますが、問題がない訳ではありません。

例えば、Webサイトのコンテンツを更新したけども、コンテンツ配信はキャッシュサーバーが行なっているので、更新内容が閲覧者まで渡らないという場合があります。 この場合は、パージ(キャッシュサーバー上にあるキャッシュを破棄)する必要があります。

CDNサービスを利用する上で、この点は事前に留意しておく必要があります。

Drupalサイト + CDNサービス

CDNサービスはFastly、Cloudflareなど種々あります。DrupalではこれらのCDNと連携するためのコントリビュートモジュールが提供されています。

コントリビュートモジュールを利用して、連携・コンテンツ更新時のパージなどを実施する流れになります。Drupalではこういったモジュールが無償で提供されており、CDNの導入・連携も比較的容易かと思います。

CDNサービスを利用する前に

利用する場合は、次のようなことを事前に考えなければなりません。

  • キャッシュしないパターン
    • ヘッダーに Cache-Control: s-maxage=0, max-age=0, no-cache, privateがある場合など
  • キャッシュしないパス
    • 特に管理画面はキャッシュしていると問題が起こり得るので、キャッシュしないパスの候補として挙げられると思います。
  • ブラウザキャッシュ、キャッシュサーバーのキャシュ(共有キャッシュ)の残存時間
    • 共有キャッシュの残存時間は長め、ブラウザキャッシュの残存時間は共有キャッシュより短めに設定するなど
    • 長めに設定しても、パージをしっかりしていれば大きな問題にはならないと思います。
    • どれぐらいの長さが良いかはベンダーに相談してみるのも良いと思います。

設定等

キャッシュする・しない、残存時間の指定はレスポンスヘッダー、またはCDNサービスが提供している管理画面から設定が可能です。

  • Drupalサイト側で設定する
    • HTTP Cache Controlモジュールを利用することで、Drupal管理画面からブラウザキャッシュ、共有キャッシュの残存時間等を設定できます。
    • Nginxでヘッダーを加えることも考えられます。
  • CDNサービス側で設定する
    • Fastlyであれば、VCL(Varnish Configuration Language)で設定することも考えられます。

何れにせよ、自身が管理しやすい手段を選ぶのが良いかと思います。

まとめ

  • Drupalサイトに限らず、ページの表示速度を向上させたいといった場合は、CDNサービスの利用を検討してみるのが良い。
  • キャッシュされることの注意点を理解しておこう。
    • キャッシュのせいで更新内容が閲覧者まで配信されない可能性もある。そういった場合はパージをしましょう。
  • キャッシュする・しないのパターンは事前に決めておこう。
    • ユーザーごとに表示内容が異なるページをキャッシュする場合などは注意が必要です。
  • Drupalではコントリビュートモジュールを利用することで、比較的容易にCDNの導入・連携が実現できると思います。