CDNとエッジキャッシュ
CDNとエッジキャッシュ
1)目的
CDN (Content Delivery Network)は、レイテンシと原点への負荷を低減します。エッジノード上の静的および条件付き動的コンテンツをキャッシュし、スケール、安定性、セキュリティ(DDoS/WAF)を提供し、エッジロジックを追加します。
2)キャッシュモデルとキー
'Ключ scheme+host+path+?(selected query params)+headers (Vary)'
推奨される:- Normalizeクエリ('utm _' exclude、 leave' v'、'lang'、'country'など)。
- 'Vary'(例えば、'Vary: Accept-Encoding、 Accept-Language')を最小化し、'Vary:'を避ける。
- APIの場合-route+バージョン識別子(semver、 hash、 build id)+必要なクエリ/ヘッダ(例えば、'X-Tenant')からのキー。
- パーソナライズされたページ-エッジセグメンテーション(Cookie/geoによる)またはSkip-Cache。
3) TTLポリシーとヘッダー
基本見出し:- 'Cache-Control: public、 max-age=300、 s-maxage=3600、 stale-while-revalidate=60、 stale-if-error=300'
- 「サロゲートコントロール」(サポートされている場合)は、ブラウザ以外のCDNの個別のポリシーです。
- 'ETag'/'Last-Modified'-条件付きリクエスト(304)とトラフィック節約。
- プライベートの場合:'Cache-Control: private、 no-store'、キャッシュされていない場合。
- キャッシュを許可するAPI: 'Cache-Control: public、 s-maxage=60'+バージョンキー。
推奨アプローチ:「永遠の」リソース(ファイル名の指紋付き)→'max-age=31536000、 immutable';「pages/JSON」→短いTTL+SWR。
4)障害: パージ/ソフトパージ
URLでパージする:pointwise。
タグ/キーによるパージ:グループのパージ('Surrogate-Key: products: 42 category: food'を使用)。
Soft-purge:コンテンツが「時代遅れ」にマークされ、新しいバージョンが受け取られるまでエッジは古くなります。
ウォームアップ:展開後、リージョンからメインページをプルします。
5)端の性能パターン
Stale-While-Revalidate:「古い」コピー+バックグラウンドアップデートで迅速な応答。
重要なリソースのプリフェッチ(プリロード、プリコネクト、dns-prefetch)。
圧縮:gzip/br(テキスト用)、CDNがサポートされている場合zstd。
HTTP/2/3 (QUIC):多重化およびより少ないレイテンシ。
TLSセッションの再開とOCSPが周囲に固定されています。
6)画像とビデオ
エッジでの画像の最適化:サイズ変更/フォーマットのネゴシエーション('Accept: image/avif、 webp')、 -WebP/AVIF、 DPR-Knowledge。
遅延負荷('srcset'、 'sizes')。
ビデオ:HLS/DASH、断片化されたMP4、嵐を減らすためのオリジンシールド(中央キャッシュ)。
プライベートイメージのサムネイルサービスと署名付きURL。
7)周囲の保証
WAF: OWASPルール、国/ASNブロック、キー付きレート制限(IP+クッキー+トークン)。
DDoS: L3/4スクラブ、L7チェッカー、JSチャレンジ/回転木戸。
プライベートリソース(ビデオ/レポート)の署名付きURL/Cookie: TTL+HMAC/EdDSA。
ジオフェンシングとコンプライアンス(地域の禁止など)。
8)端計算(端の論理)
ケース:- キャッシュを壊すことなくパーソナライズ:セグメント(A/B)、地理、エッジ上の言語、およびコンテンツがキャッシュされます。
- 回答/タイトルの書き換え、リダイレクト、AB分割。
- トークンベースの認証:JWT署名検証、キーバインディング。
- Canary by cookie/percent:新しいバックエンドへのトラフィックの一部。
技術の例には、Cloudflare Workers/Durable Objects、 Fastly Compute@Edge、 AWS Lambda@Edgeなどがあります。
9)複数のCDNおよび全体的な周囲
理由:カバレッジ、SLA、コスト、地域の制限、インシデントの分離。
GSLB/トラフィックステアリング:地理/レイテンシー/リアルエラー;複数の視点からの健康チェック。
シングルキー/ヘッダスキーム(サロゲートキー)、同期パージルール。
Origin-shieldは、障害のある起源を「ヒット」しないように、すべてのCDNに共通しています。
10)ログとメトリック
収集:- ヒット率(キャッシュ、CDN→エッジ/オリジン)、バイトのヒット率。
- 遅延p50/p95/p99、コード/ルートによるエラーレート。
- Originフェッチ:RPS/バイト/エラー(冗長ミスに対する保護)。
- 地域チャート(POP/ASN/国による)。
- Observabilityとの統合:Prometheus(輸出業者による引き)、Grafana/OTel(端のログからの押し)。
11) SEO スパ/SSR
SWRおよび短いTTLが付いているSEOのページは速く、新鮮です。
サイトマップ/ロボット-私たちは長い間キャッシュしますが、ソフトパージを許可します。
サービスワーカー:オフラインキャッシュ、クリティカルパスのプリフェッチ、ターゲットの更新。
12)サンプル構成とヘッダー
12.1キャッシュコントロールプロファイル
指紋が付いている静的:
Cache-Control: public, max-age=31536000, immutable
HTML/SSR:
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=60, stale-if-error=600
Surrogate-Control: max-age=600, stale-while-revalidate=120
API(キャッシュされたストアフロント):
Cache-Control: public, s-maxage=60
Vary: Accept-Encoding
12.2 NGINX (origin)-クエリ/ヘッダ正規化
nginx map $arg_utm_source $utm_skip { default 1; "" 0; }
map $args $normalized_args {
default "";
"~(^ &)v=([a-z0-9]+)(& $)" "v=$2";
}
proxy_cache_key "$scheme://$host$request_uri?$normalized_args";
add_header Surrogate-Key "product:{{id}} category:{{cat}}";
12.3 Fastly VCL-ソフトパージとキー
vcl sub vcl_recv {
set req. hash += req. http. host req. url. path;
set req. hash += querystring. decode(req. url, "v,lang");
if (req. method == "PURGE") {
if (req. http. Fastly-Soft-Purge) { softpurge; } else { purge; }
return (synth(200, "purged"));
}
}
sub vcl_deliver {
set resp. http. Surrogate-Key = "product:42 category:food";
}
12.4 Cloudflare Workers-署名されたURL
js export default {
async fetch(req, env) {
const url = new URL(req. url);
if (url. pathname. startsWith("/private/")) {
const token = url. searchParams. get("token");
if (!token! verify(token, env. SIGNING_KEY)) return new Response("Forbidden", { status: 403 });
}
return fetch(req);
}
}
12.5 Lambda@Edge-ジオオプション
js exports. handler = async (event) => {
const req = event. Records[0].cf. request;
const country = req. headers['cloudfront-viewer-country']?.[0]?.value 'US';
if (country === 'DE') req. headers['accept-language'] = [{ key:'Accept-Language', value:'de' }];
return req;
};
13)プライベートデータとAPI
キーアイソレーション(ユーザーごと/トークンごと)なしでプライベートレスポンスをキャッシュしないでください。
Signed Cookie/Headersと'Vary: Authorization'を厳格なコントロールで使用します(そうでなければ-cache-bust)。
安全な代替手段:パブリックレイヤ(キャッシュ)とプライベートインクルージョン(ESI/エッジ構成)を分離します。
14)地理/コンテンツルール
ライセンスの制限:起点をブロックする代わりに、エッジ、プレースホルダを地理的に拒否します。
年齢/規制バナー-エッジ上でレンダリングします(キャッシュをパンチしないでください)。
15)アンチパターン
'no-cache、 no-store'サイト全体→CDN効果の喪失。
不安定なヘッダーの'Vary'(例えば'User-Agent')→cardinality。
各リリースのキャッシュ全体をクリアします。
SWR→storm to originのない短いTTL。
パーソナルページは、セグメンテーション/トークンキーなしでキャッシュされます。
origin-shieldの欠如→複数の並列ミス。
16)実装チェックリスト(0-45日)
0-10日
リソースの分類:不変/HTML/API。
gzip/br、 HTTP/2/3、クエリ正規化、'Surrogate-Key'を有効にします。
SWR/IFEとベースパージを入力します。
11-25日
エッジイメージ最適化(リサイズ/フォーマット)、オリジンシールド。
プライベートメディア、WAF/DDoSプロファイル用の署名付きURL。
ダッシュボード:ヒット率、オリジンフェッチ、POPによるp95。
26-45日
マルチCDNまたはGSLB戦略、周囲のカナリア重量。
segmentation/AB/geo、キーによるソフトパージ用のEdge-compute。
CI/CDの自動温暖化とパージ統合。
17)成熟度の指標
バイトのヒット率≥静的の場合は85%、 HTML/条件付きダイナミクスの場合は60%を≥します。
起源ピーク時に安定したRPS(いいえ「嵐」)。
p95 TTFBは主要地域で≥ 30%削減されました。
インシデントに対する古い回答の%>90%(ユーザーがほとんど気づいていない)。
リリースパイプラインのパージキーの完全な自動化。
18)結論
有効なCDN回路は、キー/TTL/オプション、障害の規律、およびエッジロジックです。SWR/IFE、 origin-shield、メディア最適化、強力なセキュリティ(WAF、署名付きURL)を追加します。メトリクスを標準化し、CI/CDにパージを統合すると、高速で経済的で安定した周囲が得られ、ピーク負荷とブラックスワンに対応できます。