2026年7月12日
2026年7月12日
WordPressのマルチリージョン構成とCDN最適化方法【グローバルサイト高速化】
はじめに
WordPressサイトを海外ユーザーにも高速に届けるには、CDN(コンテンツデリバリーネットワーク)の導入が必須です。CloudFrontやBunnyCDNを使えば、画像・CSS・JSなどの静的アセットを世界各地のエッジロケーションから配信でき、オリジンサーバーへの負荷も大幅に削減できます。この記事では、WordPressへのCDN導入から自動キャッシュ削除まで実践的な設定方法を解説します。
症状・原因
- 海外ユーザーからのページ読み込みが遅いとの報告がある(GTmetrixで日本以外のスコアが低い)
- 画像や静的ファイルのダウンロードがボトルネックになっている
- トラフィックのスパイク時にオリジンサーバーが過負荷になる
解決手順
ステップ1:CloudFrontまたはBunnyCDNの静的アセット配信設定
# AWS CloudFrontディストリビューションの作成(AWS CLI)
aws cloudfront create-distribution \
--distribution-config '{
"Origins": {
"Items": [{
"Id": "wordpress-origin",
"DomainName": "example.com",
"CustomOriginConfig": {
"HTTPSPort": 443,
"OriginProtocolPolicy": "https-only"
}
}],
"Quantity": 1
},
"DefaultCacheBehavior": {
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"TargetOriginId": "wordpress-origin"
},
"CacheBehaviors": {
"Items": [{
"PathPattern": "/wp-content/*",
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"TargetOriginId": "wordpress-origin",
"Compress": true
}],
"Quantity": 1
},
"Enabled": true,
"Comment": "WordPress CDN"
}'
# BunnyCDNはWebダッシュボードで以下を設定
# Pull Zone URL: https://yoursite.b-cdn.net
# Origin URL: https://example.com
# Cache Expiration: 30 days (静的アセット)
# Smart Edge Routing: 有効化
ステップ2:WordPressのURLをCDNに書き換える
<?php
// functions.php または mu-plugins に追記
// CDNのURLを定数として定義
if ( ! defined( 'CDN_URL' ) ) {
define( 'CDN_URL', 'https://cdn.example.com' );
}
// wp-content のURLをCDNに変換するフィルター
add_filter( 'content_url', function( $url ) {
// ローカル開発環境ではCDNを使わない
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
return $url;
}
// wp-content のURLをCDN URLに置換
return str_replace(
content_url(),
CDN_URL . '/wp-content',
$url
);
} );
// アップロードされたファイルのURLをCDNに変換
add_filter( 'wp_get_attachment_url', function( $url ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
return $url;
}
return str_replace(
home_url(),
CDN_URL,
$url
);
} );
// srcset(レスポンシブ画像)のURLもCDNに変換
add_filter( 'wp_calculate_image_srcset', function( $sources ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
return $sources;
}
foreach ( $sources as &$source ) {
$source['url'] = str_replace(
home_url(),
CDN_URL,
$source['url']
);
}
return $sources;
} );
ステップ3:オリジンシールドでオリジンサーバーを保護する
# CloudFrontのオリジンシールド設定(AWS CLI)
# オリジンシールドは特定のリージョンにキャッシュを集約し
# オリジンへのリクエスト数を最小化する
aws cloudfront update-distribution \
--id YOUR_DISTRIBUTION_ID \
--distribution-config '{
"Origins": {
"Items": [{
"Id": "wordpress-origin",
"DomainName": "example.com",
"OriginShield": {
"Enabled": true,
"OriginShieldRegion": "ap-northeast-1" // 東京リージョン
}
}]
}
}'
# Nginx でCDN以外からの直接アクセスをブロック
# オリジンサーバーを保護する設定
# /etc/nginx/sites-available/wordpress.conf
server {
# CDNのIPレンジのみアクセスを許可
# CloudFrontのIPレンジ(実際のIPは公式から取得)
allow 120.52.22.96/27;
allow 205.251.249.0/24;
# ... その他のCloudFront IPレンジ
# それ以外からのアクセスはブロック
deny all;
# ただしACMEチャレンジは許可(SSL証明書更新用)
location /.well-known/acme-challenge/ {
allow all;
}
}
ステップ4:Route53レイテンシールーティングとCloudflare負荷分散
# AWS Route53でレイテンシーベースのルーティングを設定
# 各リージョンに同一ドメインで最も近いサーバーにルーティング
# 東京リージョン(ap-northeast-1)のレコード
aws route53 change-resource-record-sets \
--hosted-zone-id YOUR_ZONE_ID \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "tokyo",
"Region": "ap-northeast-1",
"TTL": 60,
"ResourceRecords": [{"Value": "TOKYO_SERVER_IP"}]
}
}, {
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "example.com",
"Type": "A",
"SetIdentifier": "virginia",
"Region": "us-east-1",
"TTL": 60,
"ResourceRecords": [{"Value": "VIRGINIA_SERVER_IP"}]
}
}]
}'
ステップ5:投稿公開時の自動キャッシュ削除
<?php
// functions.php に追記
// WordPressの記事更新時にCloudFrontのキャッシュを自動削除
add_action( 'save_post', function( $post_id, $post ) {
// 公開状態の投稿のみ対象
if ( $post->post_status !== 'publish' ) return;
$permalink = get_permalink( $post_id );
// CloudFrontキャッシュの無効化
cloudfront_invalidate_paths( [
parse_url( $permalink, PHP_URL_PATH ), // 記事のURL
'/', // トップページ
'/page/*', // ページネーション
'/feed/', // RSSフィード
] );
}, 10, 2 );
// CloudFront APIでキャッシュを削除する関数
function cloudfront_invalidate_paths( array $paths ) {
// AWS SDKが必要(composer require aws/aws-sdk-php)
if ( ! class_exists( 'Aws\CloudFront\CloudFrontClient' ) ) return;
$client = new Aws\CloudFront\CloudFrontClient( [
'version' => 'latest',
'region' => 'us-east-1',
'credentials' => [
'key' => defined( 'AWS_ACCESS_KEY_ID' ) ? AWS_ACCESS_KEY_ID : '',
'secret' => defined( 'AWS_SECRET_ACCESS_KEY' ) ? AWS_SECRET_ACCESS_KEY : '',
],
] );
$client->createInvalidation( [
'DistributionId' => defined( 'CLOUDFRONT_DISTRIBUTION_ID' ) ? CLOUDFRONT_DISTRIBUTION_ID : '',
'InvalidationBatch' => [
'Paths' => [
'Quantity' => count( $paths ),
'Items' => $paths,
],
'CallerReference' => 'wp-' . time(),
],
] );
}
// BunnyCDNのキャッシュパージ(APIキーが必要)
function bunnycdn_purge_url( string $url ) {
wp_remote_request(
'https://api.bunny.net/purge?url=' . urlencode( $url ),
[
'method' => 'POST',
'headers' => [
'AccessKey' => defined( 'BUNNYCDN_API_KEY' ) ? BUNNYCDN_API_KEY : '',
],
]
);
}
注意事項
- 管理画面のCDN除外: wp-admin以下はCDNにキャッシュさせないこと。CloudFrontのキャッシュビヘイビアで
/wp-admin/*と/wp-login.phpは「No-Cache」に設定する。 - WordPressのURLと実際のURLの一致: CDN経由でアクセスした場合にWordPressが正しいURLを生成するよう、
WP_HOMEとWP_SITEURLをCDNドメインではなくオリジンドメインに設定する。 - SSLとCDNの連携: CDN経由でHTTPSを提供する場合、オリジンとCDN間もHTTPS通信にすることで中間者攻撃を防止する。
まとめ
CDNとマルチリージョン構成の組み合わせにより、世界中のユーザーに対して低レイテンシーでWordPressコンテンツを提供できます。静的アセットのCDN配信・URLリライト・オリジンシールド・投稿更新時の自動パージを適切に設定し、グローバルなサイト高速化を実現してください。関連記事:WordPressのフルページキャッシュをNginxで実装する方法