WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

【マルチサイトにも対応】瞬間的なアクセス急増に対応!ページを静的化して負荷を軽くする方法

クライアントから連絡が来ました。
「明日、テレビ局に取り上げられて全国ネットで放送されることになりまして、アクセス急増が見込まれるので、サイトが落ちないようにしてもらえますか?」
クライアントのやや興奮気味の明るい表情が目に浮かびます。でも、サイト運用者としては「うわっ来たか!」という感覚ですね。
アクセスがじわじわ上がってくれる分には期間も対策もありますが、明日10倍となると話が違います。
最初からこのときを見越して、ロードバランサーとサーバー複数台構成ですでに冗長化が済んでます楽勝です、という場合じゃない限り、突貫でも早急な対応が求められます。
 
【サーバーのスケールアップ】
まずこれが第一。これができればひとまずの難は逃れられそうです。AWSなら簡単。インスタンスをグレードの高いものに変更すればいきなり倍以上のスペックのサーバーが獲得できます。トラフィックが落ち着いたらすぐ元のインスタンスに戻すことを忘れずに。コストも倍ですから。

【処理の軽量化】
次に考えるのが処理の軽量化。できるだけWordPress(PHP)を動かさないようにできれば、だいぶサイトを軽くできます。特にサーバーのスケールアップができないレンタルサーバーなんかの場合はやっておきたい対策です。

  • キャッシュプラグインを入れる
  • ページをHTML化する。
    URLとディレクトリが同じになるようにディレクトリを作って、そこに今の生のページのHTMLをベタっとコピペしたHTMLファイル “index.html” を置けば、サーバーはこのHTMLファイルを読み込んで表示してくれます。
    総ページ数が少なければ、日ごろからアクセスが高いページの順にこれをすれば、まあ完ぺきではないですが、落ちるリスクはだいぶ下がります。(静的ファイルが表示されている間は、WordPressからの更新内容はページに反映されない点に注意)

 
と、ここまでは割と誰でも思いつく対策ですね。
 
今回の本題はここからです。

マルチサイトWordPressや、静的化したいページ数が多すぎていちいちディレクトリを作ってファイルを置くなんて面倒、という場合はどうするか。

マルチサイトWordPressは、ひとつのWordPressでドメインの異なる複数のサイトを管理する関係で、ディレクトリを作ってHTMLファイルを置いてしまうと、管理しているすべてのサイトのディレクトリでそのHTMLファイルが表示されてしまいます。
たとえば、aaa.com と bbb.com を管理しているとすると、companyディレクトリに index.html を置いた場合、
aaa.com/company/ も bbb.com/company/ も、同じこのindex.htmlの内容が表示されてしまいます。
これじゃあダメですね。
そこで、HTMLファイルは一箇所にまとめておいて、プログラムで分岐をつくって、各ページで読み込むファイルを指定することでこれを解決します。
ここではドキュメントルートに static というディレクトリを作って、そこにHTMLをまとめておく場合について書きます。

wp-config.php の一番先頭にこのように書きます。

// トップページ静的HTML
if ($_SERVER['REQUEST_URI'] === '/') {
  if ($_SERVER['HTTP_HOST'] === 'aaa.com') { // aaa.comサイト
    readfile(__DIR__ . '/static/aaa-top.html'); //aaa.comトップの静的HTML
    exit;
  } elseif ($_SERVER['HTTP_HOST'] === 'bbb.com') { // bbb.comサイト
    readfile(__DIR__ . '/static/bbb-top.html'); //bbb.comトップの静的HTML
    exit;
  }
}

// companyページ静的HTML
if ($_SERVER['REQUEST_URI'] === '/company') {
  if ($_SERVER['HTTP_HOST'] === 'aaa.com') { // aaa.comサイト
    readfile(__DIR__ . '/static/aaa-company.html'); //aaa.comのcompanyページの静的HTML
    exit;
  } elseif ($_SERVER['HTTP_HOST'] === 'bbb.com') { // bbb.comサイト
    readfile(__DIR__ . '/static/bbb-company.html'); //bbb.comのcompanyページの静的HTML
    exit;
  }
}

・・・

こんな感じで必要な分だけ書きます。
ここに記述していないページについてはこれまでどおりWordPressが処理してページを表示してくれるので、特にアクセスの多いページについてだけ書けば良いです。コードやソースがまとまってるので、落ち着いたら削除して元に戻すのも簡単です。
 
そうこうして、突貫ですが、なんとか対応しました。
どうか、明日サイトが落ちませんように。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!