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
- 以下のヘッダをunsetする
- /var/www/html/wordpress/wp-adminディレクトリ
- 以下のヘッダをsetする
- Pragma no-cache
- Cache-Control no-cache
- 以下のヘッダをsetする
- /var/www/html/wordpressディレクトリ
- 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>
- <Directory />
- /var/www/html/wordpress/.htaccess
- Header unset Pragma
Header unset Cache-Control
Header unset Expires
- Header unset Pragma
- /var/www/html/wordpress/wp-admin/.htaccess
- Header set Pragma no-cache
Header set Cache-Control no-cache
- Header set Pragma 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ポートへアクセスする(無限ループ)