WordPressのCDN化:レベル2


WordPressのCDN化:レベル2

最新情報はWordCampで発表しました発表資料

WordPressサイト全体をCDN化する方法です。Yahoo砲などの瞬間ピークに対しても耐えるサイトになります。ただし、単純にWordpressにCDNを適用すると、以下の問題が発生します:

  • サイトをアクセスしているとオリジンサイトに誘導されてしまう
    • WordPressは、生成するリンクに、”WordPressアドレス”を使用したフルパスを利用する
  • 記事の投稿がうまくいかない(「メディアを追加」ボタンを押しても反応しない等)
    • キャッシュすべきでないファイルをキャッシュする
  •  記事がキャッシュされず、オリジンサーバの負荷が高いまま
    • WordPressは、phpファイルにcache-control:no-cacheを付ける

今回は、これらを回避する設定について紹介します。

前提

今回の説明では、公開用FQDNおよびオリジンを以下のものとします:

  • 公開用
    • FQDN:www.example.jp
  •  オリジンサーバ
    • FQDN:www-orig.example.jp
    • IPアドレス:192.168.0.10

基本設定

以下の設定をWordpress, Apache, CDNに行うことにより、前記トラブルは解消します:

  • WordPress設定
    • WordPress アドレス (URL): http://www.example.jp/wordpress
  • Apache設定
    • /var/www/html/wordpressディレクトリ
      • 以下のヘッダをunsetする
        • Pragma
        • Cache-Control
        • Expires
    • /var/www/html/wordpress/wp-adminディレクトリ
      • 以下のヘッダをsetする
        • Pragma no-cache
        • Cache-Control no-cache
  •  CDN設定
    • オリジンホスト:192.168.0.10
    • オリジンにアクセスする際のホストヘッダ:www.example.jp
    • オリジンにアクセスする時のポート:80
    • TTL設定:10秒程度

TTL時間補足

この設定では、記事の変更時におけるCDNのファイルパージは行われませんが、TTLを10秒としたため、少し待てば新しい記事に更新されます。

逆に、10秒に1回はオリジンサーバへのキャッシュ確認アクセスが発生してしまいます。しかし、国内配信であれば、このアクセスは短時間で終了するため、大きな問題(ディレイ)とはなりません。また、オリジンサーバの負荷という視点では、ユーザからのリクエスト数が何万、何千万になろうと一つのファイルに対しては10秒に1回しかアクセスが発生せず、大きな負荷低減になります。

Apache補足

Apacheでhttpヘッダを制御するにはいくつか方法がありますが、簡単なものとしては.htaccessの利用です。この場合の設定は以下のようになります:

  • /etc/httpd/httpd.conf
    • <Directory />
      Options FollowSymLinks
      # AllowOverride None #.htaccessを有効化するためにコメントアウト
      </Directory>
    • <Directory “/var/www/html”>
      #    AllowOverride None #.htaccessを有効化するためにコメントアウト
      </Directory>
  • /var/www/html/wordpress/.htaccess
    • Header unset Pragma
      Header unset Cache-Control
      Header unset Expires
  • /var/www/html/wordpress/wp-admin/.htaccess
    • Header set Pragma no-cache
      Header set Cache-Control no-cache

サイトのSSL化

サイトをSSLにする場合、以下のように、WordpressアドレスをhttpsにしCDNからも443ポートでアクセスさせる必要があります。

  • WordPress設定
    • WordPress アドレス (URL): https://www.example.jp/wordpress
  •  CDN設定
    • オリジンホスト:192.168.0.10
    • オリジンにアクセスする際のホストヘッダ:www.example.jp
    • オリジンにアクセスする時のポート:443
    • TTL設定:10秒程度

ここで、Wordpress設定だけをhttpsにした場合(オリジンへは80ポートでアクセス)、以下のようなエラーが出ます:

  • www.example.jp ページは機能していません
    www.example.jp でリダイレクトが繰り返し行われました。

これは、以下のような無限ループが発生しているためです:

  • ブラウザ→CDN:443でアクセス
  • CDN→オリジン:80でアクセスする。オリジン(wordpress)は443ポートへのリダイレクトを発行
  • ブラウザ:443ポートへのリダイレクトを受信する。そして、再度同じ443ポートへアクセスする(無限ループ)