「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 を素通りするように設定する。
- PUT, POST等のHTTPメソッド有効化
- キャッシュを無理やり無効化する
その他、考慮すべき点
CloudFront 導入検討時の備忘録 | CloudAdvisor
- Hostヘッダと CloudFront 独自のヘッダたちをオリジンへフォワードする
- デバイス判定対応
CloudFront-Forwarded-Proto
対応- CloudFront のログ有効化