【WordPress】アクセス過多で503&表示速度高速化に対応する方法。キャッシュプラグインを使う

閲覧数:350 views

あなたが今、読んでいるカテゴリー:
wordpress

この記事の対象者:中級~上級

先日、テレビで放送された話題のアプリについての記事に対して集中アクセスが発生し「503 Service Temporarily Unavailable」が頻発しました。

さくらコントロール リソース使用状況503エラー

初めて一日でGoogleアナリティクス上で10000PVを超えましたが、およそ6000人近くの方にこのエラーを返してしてしまい閲覧できない状態にさせてしまいました。( エラーさえおきなければ16000PV以上はあったのか… )

以前にもこういうパターンは何回かあったのですが、そろそろブログのアクセスも増えてきたのでアクセス過多によるエラーを削減する為の対応を行いました。

自分のブログの処理の問題点を洗い出す

このブログはさくらインターネットのスタンダードプランを利用しています。以下、さくらインターネットの公式ヘルプに記載されている503ステータスを返す場合についての記載です。

一時的にウェブアクセスが集中している
※ お客様のウェブページに対して訪問者のアクセスが集中しているため、一時的に込み合っていることを示すエラーメッセージです。
時間を置いてもう一度確認するか、アクセスが少ないと思われる時間帯にもう一度接続してみてください。
お客様のCGIプログラムが誤作動を起こしている
※ 設置しているCGIが何らかの原因で誤作動を起こしている可能性があります。
sshを利用できる状況であれば、動作不良プロセスがあるかどうか確認し、不良動作プロセスを強制終了させることができます。
利用することが困難な場合は、さくらインターネットサポートセンターに直接ご依頼ください。
アクセス転送量が多い
※ お客様のウェブページに対してアクセス転送量が著しく集中した場合、他のユーザに迷惑をかけないために一時的に表示される場合があります。
転送量の多いコンテンツを見直すか、上位プランなどご検討ください。

たしかに集中アクセスで制限がかかったのは原因の一つではありますが、うちのブログの場合は定期的にこういうアクセスがある訳ではありません。それよりも元々このブログは記事を表示する度に、

  • OAuthを使用してTwitterAPIを叩く実装をしている
  • 記事ランキングを表示するのに毎回ランキングの計算を行っている

という処理を毎回実行する既知の問題がありました。ページ表示毎に叩くので、CPU負荷が高くなり、アクセス制限を受けやすい作りだと考えています。TwitterAPIも連続して呼び出せる回数に制限があるので、実装的にあまりよろしくない事をしています。まずはここを改善する所から始めました。

キャッシュ系プラグイン「WP Super Cache」を使ってみる

今回は、かの有名なプラグイン「JetPack」や「Akismet」を作成しているAutomattic社のプラグイン「WP Super Cache」を使用しました。

WP Super Cache – WordPress

このプラグインはキャッシュ用の静的なhtmlを出力しておき、キャッシュの有効期限中は毎回動的に一からページを作成せずに静的なhtmlの内容を返してくれるプラグインです。
毎回、一から動的にページを生成する処理がなくなるのでCPU負荷が減る上に、表示速度の改善にもつながります。

今回、筆者が使ったプラグインの設定

WP Super Cache設定

基本的に推奨設定のみONにしていますが、一部設定を変更しています。

「ページを圧縮し、訪問者により速くページを供給する。 (推奨)」 はOFF

設定をONにするとgzipを使った圧縮ファイルによる転送を行うようになります。gzipを利用した圧縮ファイルに転送は、以前、mod_deflateを使用して表示速度の改善を試みた時にあまり改善出来なかったので今回は見送りました。

この設定はOFFにしています。

「Mobile device support. 」はON

レスポンシブデザインを使用していたとしてもwp_is_mobile関数などで、スマホとPCで表示処理を分けている場合に必要です。

静的htmlを出力するといいましたが、この設定をONにしておかなければスマホで閲覧された時にキャッシュのhtmlが出力された場合、他の方がPCで見た時もスマホで閲覧したときのキャッシュが表示されてしまいます。

キャッシュソース

設定をONにするとPC用とモバイル用のキャッシュ用htmlを別々に出力し、プラグインがユーザーエージェントでスマホからかPCからかのアクセスを判定して、適切なページをユーザーに返してくれます。

この設定はONにしています。

キャッシュ有効後、どれだけ改善されたのか?

キャッシュ無効時

キャッシュ無効時

キャッシュ有効時

キャッシュ有効時

計測回数不足かもしれませんが、同ページで各3回ずつページの表示速度を計測した結果です。キャッシュ有効後は表示速度も短縮されています

CPU使用率については、まだ比較は行っていませんがページ表示毎に

  • OAuthを使用してTwitterAPIを叩く実装をしている
  • 記事ランキングを表示するのに毎回ランキングの計算を行っている

という処理がなくなったので、確実にサーバーのCPU使用率は減っているはずです。これについてはキャッシュ有効化後にどのように変わったか経過を暫くみてみます。

キャッシュ系プラグインを使う場合は注意が必要

キャッシュ系のプラグインを使って

「画面が真っ白になった、wordpressが壊れた」

ということをよくネット上で見ますが、これはインストールやアンインストールの手順を間違えた場合に発生します。今回筆者が対応するのに使ったプラグイン「WP Super Cache」はwp-config.phpの書換え、.htaccessの書換えも行います。どちらのファイルもサーバー全体の設定に関わる重要なファイルです。

簡単ではありますが、問題が発生した場合の対応方法を記載しておきます。

ページを表示したら、なんか変なコードが「わっ」と表示された場合

wp-configでエラー

wp-config.phpの記述に問題が発生しています。設定が間違っていないか、文法に間違いがないかを確認してください。このプラグインはwp-config.phpを書き換える際に「Added by WP-Cache Manager」というコメント文を追加してくれるので、ファイル内を検索してみたらすぐに問題の箇所が見つかるかもしれません。

500 Internal Server Errorが発生した場合

wordpressのディレクトリ内にある.htaccessの記述に問題がないか確認してみてください。mod_rewriteによるキャッシュ制御を行った場合、.htaccessの変更が必要です。この設定がうまくいかなかったのが原因の可能性が高いです。

プラグイン停止後、記事のリンクを押しても記事が表示されない場合

「500 Internal Server Errorが発生した場合」と同等の原因です。プラグインは停止したが、.htaccessにはmod_rewriteの設定だけが残ってしまった可能性が高いです。

パーマリンク設定画面で更新ボタンを押したら直ったという記事を見ましたが、これはパーマリンクの更新を行った際に.htaccessの書換えが発生したのでたまたま直ったのかと思われます。

.htaccessの記述に問題がないか確認してみてください。

キャッシュ系プラグインを使う事で副作用が発生する事を理解する事も大事

ページの表示処理の中に閲覧数をカウントするようなプラグインを使用している場合は閲覧数がカウントされなくなる可能性があります。これはキャッシュ期間中は静的ページの内容を返すので、カウントを行うphpのコードが実行されないからです。

筆者は閲覧数のカウントと閲覧ランキングを作成するのにWordPress Popular Posts(Version 3.3.1)を使っていますが、この点はプラグインがAjax(非同期通信技術の事です)のコードをデフォルト設定で出力してくれていたので問題ありませんでした。キャッシュ更新時に閲覧数の表示も更新されます。もしこのプラグインを使っている場合でキャッシュ化する事でアクセスカウンタが正しく動かない場合は設定画面にAjaxに関する設定があるので試してみるのもよいかもしれません。

理解さえすれば便利なプラグインだが、初心者向けのプラグインではない

プラグインのインストール方法とアンインストール方法はプラグインフォルダ内のreadme.txtに記載されている場合が殆どです。今回使用したキャッシュプラグイン「WP Super Cache」もreadme.txtに英文ですがどのファイルを変更するかやインストール、アンインストール方法が記載されています。

  • .htaccessやwp-config.phpに何が書かれているか
  • プラグインがどこのディレクトリにどのようなファイルを出力するのか、どのファイルを書き換えるのか

を理解している方であれば、キャッシュ系のプラグインはお勧めです。表示速度改善にもつながります。ですが、他の方がネットで言っているように初心者の方やであればキャッシュ系のプラグインは使わない方がよいというのも本当です。設定を間違えれば画面が真っ白になったり、エラーが発生する可能性もあります。プラグインを削除する場合も、アンインストールを正しく行わなければ設定ファイル内やフォルダにゴミが残ります。

さいごに

今回筆者が対応した方法は、アクセス過多と表示速度改善対策のうちの一つにすぎませんが、集中アクセスでサーバーが503エラーを返す場合やリソース制限をよく受ける方は一度、キャッシュ制御による対策をおこなってみてはいかがでしょうか。参考になりましたら幸いです。

スポンサーリンク