WordPress 製のサイトに CloudFront を導入してバリバリキャッシュさせようと検討したときの記録

「WordPressってPHPで動的だけど、サイト表側に限ってみると内容的にほとんど静的だし、もういっそのことキャッシュさせちゃって良くない?」

と思って CloudFront でPHP含めサイト全体をキャッシュさせてしまおうと検討したけど、 面倒くさくなってやめたときの記録。

TL;DR

下記を参考にすればバリバリキャッシュできそうでしたが、 自分は検討だけして設定するのが面倒くさくなったので試してません。

前提

  • サイト表側については内容的にほぼ静的なので、なるべく CloudFront でキャッシュヒットさせてオリジンへのアクセスを減らす
    • アセット系ファイル (JS, CSS, メディアファイル) はすべて純粋な (CDNで共有キャッシュ可能な) 静的ファイルであるものとする
    • サイト表側にPOSTを要するフォーム (コメント欄、お問い合わせフォーム) の類は存在しないものとする
    • admin-ajax.php, xmlrpc.php, wp-json 等のAPI的なリソースはサイト表側では使用していないものとする

サイト表側

  • * (Default Cache Behavior)

内容的に静的なもののGETリクエストだけで済むはずなので、基本的には盛大にキャッシュ有効化できるはず。

Forward Cookies: オリジンへフォワードする Cookie について

管理画面のみ別ドメインにしてあるなど、特別な設定が施されていない限り、記事プレビュー画面とサイト表側の記事詳細ページのURLパス部までは同じになるはずである (ただし、記事プレビュー時は ?preview=true というクエリ文字列が付与される) 。

よって、オリジンへ WordPress のCookieをフォワードするようにしてログイン状態を判別できるようにしないと記事プレビューが正常に行えなくなってしまう。

かといって、面倒臭いから All としてしまうと、Google アナリティクスが導入済みの場合、 トラッキングコードが設定するCookie (_ga, _gid など) の影響により、キャッシュヒット率が激減してしまう。

よって、キャッシュヒット率を上げるためには、 Whitelist として、フォワードするCookieを WordPress 関連のもののみに限定する必要がある。

wp-settings*
wordpress_logged_in*

※その他、プラグイン等が独自に設定するCookieなど、環境によってはフォワードすべきCookieが他にも存在する可能性があるので環境次第で個別に要検討かと思われる

Query String Forwarding and Caching: オリジンにフォワードすべきクエリ文字列やキャッシュ時に判別すべきクエリ文字列について

少なくとも、記事検索時のもの (?s=keyword) や、記事プレビュー時のもの (?p=38253?preview=true) 等は Whitelist に追加する必要がある。

その他、Cookie 同様にプラグイン独自のものが存在する可能性もあるので、、、 もう Forward all, cache based on whitelist でいいのでは……?

管理画面など

  • /wp-admin/*
  • /wp-login.php

下記を設定して、CloudFront を素通りするように設定する。

その他、考慮すべき点

CloudFront 導入検討時の備忘録 | CloudAdvisor

  • Hostヘッダと CloudFront 独自のヘッダたちをオリジンへフォワードする
  • デバイス判定対応
  • CloudFront-Forwarded-Proto 対応
  • CloudFront のログ有効化

参考