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_HOMEWP_SITEURLをCDNドメインではなくオリジンドメインに設定する。
  • SSLとCDNの連携: CDN経由でHTTPSを提供する場合、オリジンとCDN間もHTTPS通信にすることで中間者攻撃を防止する。

まとめ

CDNとマルチリージョン構成の組み合わせにより、世界中のユーザーに対して低レイテンシーでWordPressコンテンツを提供できます。静的アセットのCDN配信・URLリライト・オリジンシールド・投稿更新時の自動パージを適切に設定し、グローバルなサイト高速化を実現してください。関連記事:WordPressのフルページキャッシュをNginxで実装する方法

お気軽にご相談ください

お見積りへ お問い合わせへ