ウェブアクセラレータでWordPressを無敵化!Service Temporarily Unavailable(503)エラーを出さなくする方法

はじめに

さくらインターネットの谷口です。いつもさくらのレンタルサーバをご利用いただきありがとうございます。さくらのレンタルサーバは共用サービスのため、負荷をかけすぎると接続が制限されてService Temporarily Unavailable(503)エラーが表示される場合があります。俗に「鯖落ち(さばおち)」と呼ばれていますが、正確には落ちているわけではなくプログラムの実行数に制限があって、その制限を超えたアクセスが来て処理を止めている状態になります。もちろん、同じサーバ内の他のお客さんのサイトは正常に表示されています。

これはレンタルサーバを安価に、かつ安定して提供するために行っている制限ですが、アクセス集中時にサイト閲覧ができなくなることで機会損失にも繋がります。上位プランでは制限値が緩和されており、さらにさくらのVPSやさくらのクラウドへの移行により制限は無くなりますが、サーバの移行はハードルの高い作業となり、またお金もかかります。レンタルサーバと違い管理者権限が与えられるサービスは自由度が高い分、サーバの管理の手間も必要になってきます。

さくらインターネットではクラウドサービスの1つとして、ウェブアクセラレータというCDN(Content Delivery Network)サービスを提供しています。エンドユーザとデータが入っているサーバの間にCDNを挟むことでサーバの負荷を減らすことができます。今回はこのCDNを使ってプラン変更をせずに503エラーとさよならする方法をご紹介します。

なお、この記事の内容は.htaccessやDNSなどの設定操作を含みますので上級者向けとなっています。レンタルサーバのサポート対象外の利用方法となりますのでご注意ください。さくらのレンタルサーバでは、より簡単にウェブアクセラレータを利用する仕組みも検討中です。

その前に、CDNって何!?という方にはこちらの記事をご覧ください。

CDNで機会損失を回避!CDNの仕組みから導入効果の試算まで分かりやすくご紹介。 - さくらのナレッジ

この記事では、CDNの設定、DNSの設定変更、.htaccessの編集とWordPressの設定変更を行い、WordPress on さくらのレンタルサーバをキャッシュ配信するまでの手順を解説します。いきなり本番サイトで設定するよりも、まずはCDNの設定の流れを理解するためにテストサイト(テスト用のドメイン)で試していただくのがよいかと思います。

下準備と注意事項

今回の設定例では以下のようにドメインを定義します。

www.example.com:公開中のサイトFQDN
cdn.example.com:オリジン指定用のFQDN

※CDNの利用にDNSのCNAMEレコードを利用します。CNAMEの設定できないゾーンアペックス(ネイキッドドメイン) 例)example.com では利用できません。

今回必要なものは以下になります。

  • さくらインターネット会員ID
  • さくらのレンタルサーバ契約
  • さくらのクラウドアカウント

注意事項

  • 今回ウェブアクセラレータの設定ではDNSのCNAMEレコードを利用します。DNS設定変更時にサイトが一時的に閲覧できなくなります。
  • 会員IDは持っているが電話認証が済んでいなくてクラウドが利用できない場合、一度会員IDにログインした状態で cloud.sakura.ad.jp の「今すぐ始める」をクリックしてください。
  • 今回は全ファイルキャッシュのやり方をご紹介していますが、ECサイト、会員制サイトなど、個人用のマイページがあるサイトの場合、サイトの全ファイルキャッシュを行うとマイページが異なる会員に表示されるといった、意図しない挙動になる可能性があります。指定フォルダをキャッシュ除外する等の対応が必要になりますのでご注意ください。
  • WordPressのマルチサイト機能を利用している場合は利用できない可能性があります。
  • ネームサーバはさくらのクラウド DNSを利用する前提ですが、お名前.comなどの他社ネームサーバでも利用できます。さくらのドメインメニューをお使いの場合のみ、設定が反映されない場合があります。さくらのクラウドDNSへドメインを引っ越すことで利用可能です。

DNS設定の変更

さくらのドメインメニューを利用している場合は、さくらのクラウド DNSなどへ引っ越しをします。今回のように www.example.com のようなレンタルサーバと連携したwww付きドメインを扱う場合、ドメインメニューではデータが書き換えられない場合があるためです。

さくらのクラウドDNSは1ゾーンにつき月額43円(税込)と格安で利用できます。すでにお名前.comやAWS Route53といった他社のネームサーバを利用中であれば、そのまま設定が可能です。さくらのクラウドDNSの利用方法についてはこちらのマニュアルサイトをご覧ください。

ネームサーバの設定画面へアクセスし、 www.example.com のAレコードTTLを60秒程度に変更します。現在のTTLが86400秒であれば、1日後にTTL60秒が有効になります。設定するIPアドレスはレンタルサーバコントロールパネル サーバ情報から確認できます。

次に、レンタルサーバコントロールパネルからオリジン指定用FQDNでドメイン設定を新規作成します。ドメイン設定→新しいドメインの追加ボタン→他社ドメインの追加を選び、オリジン指定用FQDNを入力します。

ネームサーバ設定からAレコードをさくらのレンタルサーバに指定します。

今回、example.comのネームサーバ設定を全てさくらのクラウドDNSへ移譲するので、他のリソースレコードが設定されている場合は全て引っ越ししておく必要があります。設定が誤っているとメールの受信などができなくなりますのでご注意ください。設定が済んだら、ドメインメニューのWHOIS情報編集で、ネームサーバを変更します。

それぞれ反映に少々時間がかかりますので、1日以上前に済ませておくことをおすすめします。 cdn.example.com へアクセスして www.example.com のサイトが見れていれば成功です。

設定手順

それでは実際に設定作業を始めていきます。

ウェブアクセラレータ設定

先にウェブアクセラレータの設定を済ませておきます。ウェブアクセラレータの設定方法は大きく分けると3パターンあります。

  1. ウェブアクセラレータで提供するドメインを使う
  2. お客様が利用中のドメイン(独自ドメイン)にサブドメインを新規に作って設定する
  3. 独自ドメインのまま設定する

さくらのレンタルサーバでウェブアクセラレータを利用する場合、1,2の方法ではキャッシュされるファイルが全てではないため、高負荷時のService Temporarily Unavailable(503)を防止することがほぼできません。そのため今回は3の独自ドメインにウェブアクセラレータを設定する方法のみをご紹介します。

ウェブアクセラレータの設定については、さくらのサポート情報をご覧ください。この中のSTEP5、ステータスの有効化までを行います。ここまで行ってもサービスへの影響はありませんのでご安心ください。オリジンのFQDNを設定する際に、cdn.example.com(ご自分でお持ちのドメインにサブドメインを新規でつけてください。エンドユーザには見えません。)を設定します。サイトが既にSSL化されている場合は、秘密鍵とサーバ証明書をウェブアクセラレータへ設定する必要があります。

独自ドメインでのSSL設定についてもさくらのサポート情報に記載されています。

さくらのレンタルサーバ設定

サイトをSSL化している場合

サイトをすでにSSL化している場合は、リダイレクト用の.htaccessの記述を削除する必要があります。また、さくらのレンタルサーバ 常時SSL化プラグインを利用している場合はプラグインを無効化してください。http→httpsのリダイレクトは記述の削除により一時的に停止しますのでご注意ください。次に、.htaccessに以下の記述を追加します。

SetEnvIf X-Forwarded-Proto "https" HTTPS=on
SetEnvIf X-Forwarded-Proto "http$" HTTPS=off

この値を追加することで環境変数[HTTPS]の値をコントロールできます。

ネームサーバの設定

DNSの設定画面から、 www.example.com のAレコードを消去しCNAMEレコードを追加します。AやTXTとCNAMEは共存できませんので、必ずAを削除しなければいけません。CNAMEレコードの値は、ウェブアクセラレータから払い出される *****.webaccel.jp を設定します。この設定を有効化する段階ですべてのトラフィックがウェブアクセラレータ経由に切り替わりますが、キャッシュは有効になっていません。また、切り替えた段階からウェブアクセラレータの課金が開始されますのでご注意ください。他社のネームサーバの設定方法については、各ネームサーバのサポートサイトをご確認ください。

キャッシュ設定

CNAMEを設定後、下準備で設定したTTL秒数を経過したらウェブアクセラレータ配信に切り替わります。(TTLが86400など長い場合はここで1日待たされます。そのために下準備をしました。) www.example.com へアクセスして実際にウェブアクセラレータから配信されているかどうか確認してみましょう。

レスポンスヘッダを確認して、Viaヘッダーに http/1.1 sv11-tky01-jp といった文字列が入っており、X-Cacheの値が MISS になっていれば設定は成功です。これからキャッシュの設定を始めましょう。

さくらのレンタルサーバ コントロールパネルへアクセスし、ファイルマネージャを起動します。

先にキャッシュ除外の設定を行います。cdn.example.com のドキュメントルートを開き、WordPressの管理画面である wp-admin のフォルダを開きます。.htaccess ファイルの一番上に以下の文字列を追加します。(ファイルがない場合は新規作成します。)

Header set Cache-Control "no-cache"

これにより、管理画面のキャッシュを防ぐことができます。管理画面をキャッシュしてしまった場合、例えば投稿しても投稿が画面に反映されない、画像をアップロードしても確認できない等の不具合が生じることがあります。これを防ぐため、管理画面はあらかじめキャッシュを行わない設定をしておきます。

※管理画面以外にも、キャッシュすべきでないコンテンツがある場合はディレクトリ単位、ファイル単位でキャッシュ除外を行ってください。マイページやカートがあるECサイト、会員制サイトなどを運営している場合は個人情報の流出などを招くため注意が必要です。

次に、キャッシュを有効にする設定を入れていきます。先程の /wp-admin 配下から一階層上に戻ります。.htaccessファイルを開き、先頭に以下の記述を追記します。

Header set Cache-Control "s-maxage=60, public"

これは全ファイルを60秒間ウェブアクセラレータへキャッシュする指示になります。キャッシュ時間はもっと長くする方が効果的ですが全ファイルキャッシュは意図しないコンテンツが消えなくなるリスクを伴いますのでまずは短めに設定することをおすすめします。

キャッシュの確認

キャッシュされているかどうかの確認は、ブラウザのデベロッパーツールで行います。先程と同じく、 www.example.com へアクセスしてレスポンスヘッダを確認します。

レスポンスヘッダ Cache-Control に「s-maxage=60, public」が設定されていることを確認し、X-Cahceが「HIT」になっていればキャッシュ配信は成功です。MISSになっている場合でも数回リロードすることでHITへ変わります。10回程度リロードしてもMISSの場合は設定値が反映されていない可能性がありますので、 .htaccess の記述を確認してください。

phpファイルのキャッシュ有効化

さて、WordPressでは全ファイルキャッシュ設定を .htaccess に書き込んでも、投稿ページなどのHTMLファイルは強制キャッシュOFF(Cache-Control "no-cache")になっているためキャッシュされません。

そこで、WordPressのwp-config.phpを修正してページのHTMLもキャッシュする設定に変更します。

以下の記述を追記します。

add_filter( 'nocache_headers', 'custom_nocache_headers' );
function custom_nocache_headers( $headers ) {
unset( $headers['Expires']);
unset( $headers['Cache-Control']);
unset( $headers['Pragma']);
return $headers;
}

これにより、ページのHTMLがキャッシュ配信されるようになります。再びデベロッパーツールでサイトへアクセスし、一番上にあるページHTMLのキャッシュ状況を確認しましょう。

これで全ファイルのキャッシュ設定が完了しました。

サイトを常時SSL化している場合

wp-config.phpに以下の記述を入れます。

$_ENV['HTTP_HOST'] = 'www.example.com';
$_SERVER['HTTP_HOST'] = 'www.example.com';

現在の設定はHOSTヘッダーが cdm.example.com になっています。WordPressの標準機能を利用する場合、特に設定の必要はありませんがプラグインなどで環境変数を利用する場合は設定しておく必要があります。

この状態で、http→httpsのリダイレクトを行いたい場合は.htaccessに以下の記述を入れます。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !^https$
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

※www.example.comは今使っている公開FQDNを入力します。

キャッシュ設定有無によるパフォーマンスの違い

実際キャッシュ設定を行った場合の503エラー率について、実際のさくらのレンタルサーバを使って検証してみました。細かい数字を出すと制限値がわかってしまうのでざっくりとした内容でご容赦ください。

Apache Jmeterという実際のウェブアクセスに近い負荷をかけられるツールを使ってコンスタントに503が出る状況を作ってみます。その状態で、丸裸の状態、画像のみウェブアクセラレータ配信した場合、全ファイルウェブアクセラレータ配信した場合、WP Super Cacheを使ってキャッシュ配信した場合でそれぞれ比べてみます。テストページの容量は500kb程度。画像サムネイル6枚と文字列で構成しています。

丸裸
WP Super Cache
画像のみ
全ファイル
503が出る率 86% 86% 84% 0%

このように、PHPの実行数制限がかかった状態だと一部のファイルだけをウェブアクセラレータ配信しても効果はありません。もちろん、一般的なサイトであれば画像ファイルなどをオフロードしてサーバの負荷を減らす効果はありますが、さくらのレンタルサーバの場合はPHPの実行数制限があるため、WordPressではページへのアクセスが1回でもあると制限カウント対象となります。そのため、503エラーを回避するためには全ファイルをウェブアクセラレータで配信する必要があることがわかります。WP Super Cacheも同様の理由により効果が見られなくなっています。WP Super Cacheは動的ファイルの多くを静的化してDBアクセスなどを減らすことができますが、サーバへアクセスがあることは丸裸の状態と変わりありません。ウェブアクセラレータでのキャッシュはレンタルサーバ本体へのアクセスをゼロにできることから、503エラーの発生を防いでいることがわかります。画像のみキャッシュした場合でも同じ理由から503エラーが出る率はほぼ変わりません。

※これはあくまでさくらのレンタルサーバ上での検証であり、画像ファイルのみのCDN配信やWP Super Cacheの効果を否定するものではない点、ご了承ください。

さくらのレンタルサーバ以外でも、多くの共用レンタルサーバではPHPなどのプログラム実行数の制限や通信帯域による制限を行っています。これらの環境でも同様にウェブアクセラレータで503エラーを回避することが可能です。

キャッシュ時間の設定方法

キャッシュ時間は.htaccessに記述した s-maxage=**の値によって決定されます。例では60秒に設定しましたので、60秒間ウェブアクセラレータでデータを保持した後、再度オリジンサーバへアクセスして新しいデータを取得し、また60秒間データを保持します。ウェブアクセラレータのコントロールパネルでキャッシュヒット率を確認することができます。CDNの効果を最大限まで高めるには、キャッシュ時間を長くしてキャッシュヒット率を限りなく100%に近づける必要があります。

反面、キャッシュ時間を長くすると何かの都合で画像を差し替えたり投稿を修正した場合の反映が遅くなります。ウェブアクセラレータでは管理画面でキャッシュを削除する機能がありますし、API連携で投稿修正後にキャッシュを削除するプラグインもありますので、これらを有効活用することも重要です。

APIとかヒット率とかめんどくさいし、お手軽な設定値を教えてほしい!という方は、60秒〜300秒程度と短めに設定するのがおすすめです。こうしておけば最悪キャッシュクリアできなくても1分〜5分以内に修正が反映されます。オリジンサーバへのアクセスも1ファイルにつき1分〜5分に1回程度とそこそこの頻度に抑えられます。

料金シミュレーション

CDNの利用で気になるのは利用料金です。基本的にデータ転送量に応じた従量課金のため、アクセスが殺到すると破産する!と思われるかもしれません。

ウェブアクセラレータでは1GiB(ギビバイト)5円(税込)の転送料金をいただいています。例えば月間10万PVのサイトで、1ページの容量が500kbだとすると、

100000 * 500kb = 5千万kb = 46GiBとなり、46GiB * 5円で月間230円となります。

いかがでしょう?思ったより安くないでしょうか。他社サービスと異なり、さくらのクラウド ウェブアクセラレータでは外向き転送以外の転送量課金や基本料金、月間転送量による階段課金などを行っていません。そのため、現在のお客様の転送量から簡単に月額料金を見積もることができます。また、日ごとにデータ量を見ることができるので安心して利用できます。

まとめ

面倒な設定お疲れ様でした。設定に若干高めのハードルはありますが月額500円のレンタルサーバでも落ちないサイトを作ることは十分可能です。CNAMEレコードや.htaccessの設定が必要なのでサイトのサービス断が発生し、ちょっとややこしい箇所がありますが、原理さえわかればそこまで難しいものではないと思います。わざわざ高いプランに変更しなくても515円のスタンダードプランで数Gbpsのトラフィックにも耐えることができるサイトを構築できる、さくらのクラウド ウェブアクセラレータをぜひお試しください。500GiBの転送までは無料となりますので、気軽に使ってみてください。