Cloudflare
Cloudflareはデフォルトでは特定の拡張子の静的ファイルのみをキャッシュし、HTMLやJSONはキャッシュしない
たとえCache-Control: publicがついていたとしてもキャッシュしない
HTMLをキャッシュするにはページルールからキャッシュレベルをCache Everythingに設定する必要がある
Cloudflareで全面CDN構成にするには
DNSからオリジンサーバを登録し、プロキシを通す設定にする
SSL/TLSから暗号化モードをフル(厳密)にする
オリジンに有効な証明書かOrigin Certificatesを設定する
ページルールからキャッシュレベルをCache Everythingにする
CachingからブラウザキャッシュTTLを既存のヘッダーを優先に設定
オリジンでCache-Control: public, max-age=xxx, s-maxage=yyyを設定したレスポンスを返す
Cache-Controlヘッダを設定できない環境であれば、ブラウザキャッシュTTLおよびエッジキャッシュTTLを設定する
キャッシュ期間(TTL)
2つのTTLがある
ブラウザキャッシュTTL:ブラウザへ指示するキャッシュ期間
設定した期間がレスポンスヘッダのCache-Control: max-age=の値として指定される
エッジキャッシュTTL:Cloudflareのエッジサーバでキャッシュされる期間
ブラウザへのレスポンスヘッダとしては示されない
ブラウザキャッシュTTL:Cachingから設定(ページルールでも設定可能)
オリジンでCache-Control: max-age=xxxを返すとその値が使われる
エッジキャッシュTTL:ページルールから設定
Cache-Control: s-maxage=yyyを返すとその値が使われる
設定できる期間は限られている(ブラウザキャッシュTTLは最短30分、エッジキャッシュTTLは最短2時間)ので、Cache-Controlを使うほうが柔軟にできる
動的コンテンツのキャッシュでオリジンサーバへの負荷を下げる目的であれば、ブラウザキャッシュ(max-age)を短くし、エッジキャッシュ(s-maxage)を長めにしたい
例えばCache-Control: public, max-age=1, s-maxage=3600
ブラウザキャッシュを短くするのはキャッシュパージしたときにすぐに反映してほしいので
エッジキャッシュがあればいくらでも問い合わせくれても問題ないし
通信自体を減らしたい場合は別
やや短めのmax-ageと条件付きGETの併用がいいだろうか
エッジキャッシュTTLはアクセス頻度にもよる
あまりアクセスのないサイト(URL)では次のアクセスがあるまでにキャッシュが切れて、結局オリジンへの問い合わせになってしまう
大量アクセスがあるサイトでピークをさばく目的であれば数十秒でも大きな効果が出る
キャッシュ切れ時のレスポンスの悪化をできる限り避けたいとなるとエッジキャッシュTTLを長くした上でキャッシュパージを頑張る必要があるだろう
SSL/TLS
できればフル(厳密)にしたい
Cloudflare→オリジンサーバへの通信にSSLを使った上で証明書の検証も行うモード
オリジンサーバに有効な証明書を設定しなければならない
dns-01は更新自動化のシステムを別に作らないといけない
オリジンへの直接アクセスが必要なければOrigin Certificates(配信元証明書)が使える
Cloudflareによって署名された証明書で、これをセットすればフル(厳密)の証明書検証をパスできる
フルの場合証明書の検証は行わない(自己署名証明書などでSSL通信ができればよい)
S3をオリジンにする場合絶対に証明書エラーになってしまうので、ここはフル以下にする必要がある
S3に独自ドメインをあてる場合そのドメインをバケット名にしなければならないが、.を含むのでワイルドカード証明書と一致しなくなってしまう
EnterpriseプランであればHostヘッダの書き換えができる模様
Cookieが送られたらキャッシュしないようにする
ページルールで特定のCookieが送信されていたらキャッシュしない設定ができる
ただしBusinessプラン以上のみ