OG画像のキャッシュ方法
OG画像のキャッシュとは、毎回のシェア時に再レンダリングする代わりに、CDNから以前生成したソーシャルプレビューを配信することを意味します。FastOGはエッジで同一の画像を1年間キャッシュします。同じURLはキャッシュされたPNGを返し、クォータにカウントされず、ほぼゼロのレイテンシで配信されるため、サイトのOGトラフィックの大半はレンダラーに到達しません。
キャッシュが重要な理由
ソーシャルシェアが発生すると、プラットフォームのクローラーによるフェッチが行われます。毎回のシェアで再レンダリングが発生すると、同一コンテンツに対してクォータとレイテンシを消費してしまいます。画像のコンテンツをキーとする積極的なキャッシュにより、「シェアごとに1回のレンダリングが発生する」状態から、「最初のシェアで1回のレンダリングが発生し、それ以降のシェアは無料」という状態に変わります。
コンテンツキー型モデルが機能する仕組み
FastOGはコンテンツ署名付きURL(content-signed URL)を使用します。URLはパラメータの純粋な関数です。同じタイトル+テンプレート→同じURLになります。つまり、次のことを意味します:
- FastOGのエッジは、そのURLの下に画像を保持します。
- 同じコンテンツが10,000回共有されても、レンダリングは1回、クォータ消費は1回、残り9,999回はキャッシュヒットです。
- コンテンツを変更すると→異なるURL→新しいレンダリングが1回発生します。
GET /api/v1/og?title=Hello&template=default&key=...&s=... → render (1 quota count), then
GET /api/v1/og?title=Hello&template=default&key=...&s=... → cached (0 counts, instant)
GET /api/v1/og?title=Changed&template=default&key=...&s=... → render (1 quota count)
FastOGのキャッシュヘッダー
FastOGは、レンダリングされた画像に対してCache-Control: public, max-age=31536000, immutable(1年間)を返します。カバーはFastOGのエッジで2層に分かれて配信されます。fastog.comの前段にあるレンダーキャッシュと、その後ろにある永続オブジェクトストアです。繰り返しのフェッチは再レンダリングなしで応答され、レスポンスのX-FastOG-Worker-Cacheがどの層が応答したかを示します(HIT、R2、MISS)。
永続コピーはレンダラーに依存しないため、少なくとも1回フェッチされたカバーは、FastOGのレンダーサービスが一時的に利用できない間も配信され続けます。障害が発生しても、すでに生成済みのプレビューが空白になることはありません。これまで一度もレンダリングされたことのないカバーだけがレンダラーを必要とするケースであり、その場合FastOGはエラーではなく画像で応答します。
| 状況 | クローラーが受け取るもの |
|---|---|
| カバーがすでにレンダリング済み | エッジまたは永続ストアからのカバー |
| 未レンダリング、レンダーサービス稼働中 | オンデマンドでレンダリングされたカバー |
| 未レンダリング、レンダーサービスが一時的に停止中 | URLに含まれるページ自身の画像(商品写真)、またはニュートラルなカード。エラーページは返されません |
リクエスト自体が無効な場合(改ざんされた署名、titleの欠落など)は、対応する4xxが返されます。
公開済み画像の変更
| 変更内容 | 対応方法 |
|---|---|
| コンテンツ(タイトル、価格、写真) | 何もしない:コンテンツはURLに含まれるため、新しいコンテンツは新しいURLとなり、新しくレンダリングされます |
| テンプレートまたはレンダリングのデフォルト設定 | キャッシュバスティングバージョン(FASTOG_CACHE_BUST)を更新し、すべてのURLに新しいvパラメータを付与します |
| 同じURLを再レンダリングする必要がある場合 | サポートにそのURLのパージを依頼してください。URL単位の完全一致パージは公開エンドポイントとして公開されていません |
すでに共有されたリンクは引き続き機能し、約束した画像を表示し続けます。ただし、その完全一致URLをパージしない限りはその限りではありません。
独自のog:imageのキャッシュ(セルフホスト)
FastOGのキャッシュを使用せずに画像を自分で保存する場合は、同じルールを適用してください:
| 手順 | 詳細 |
|---|---|
| キャッシュキー=コンテンツハッシュ | 変更可能なファイル名ではなく、データのハッシュで保存する |
| 長いTTL | 安定したコンテンツにはmax-age=31536000, immutableを使用 |
| バージョン付きURL | コンテンツが変更されたらハッシュ/バージョンを追加する |
| 前面にCDN | CDNに繰り返しの取得を吸収させる |
FAQ
同じURLの共有を繰り返すと、本当にレンダリング回数は0になるのですか?
はい。同一のURLはエッジキャッシュにヒットし、レンダラーには到達しないため、クォータは消費されません。
FastOGは画像をどのくらいキャッシュしますか?
1年間です(immutable)。初回レンダリングから長期間経過した後も、共有カードはキャッシュから配信されます。
画像を更新したい場合(例:リアルタイムの価格)はどうすればよいですか?
パラメータ(価格)を変更すると、新しいURLになり、新しいレンダリングが行われます。安定したコンテンツはキャッシュされたまま、動的なコンテンツは必要なときに更新されます。