キャッシュを使ってwordpressを軽くしてみる

0. はじめに

冬真っ盛りですね、寒いですね。先日の成人式は東京も久方ぶりの大雪で混乱しましたが、降れば降ったでなんだか嬉しい気持ちになってしまいますね。

さて、ここ最近私の運営しているwordpressのサイトがひどく大変なことになっています。wordpressなサイトはいくつか複数運営しているのですが、今年に入って立ち上げたサイトも順調にアクセス数が増え、ついには限界点に近くなってきました。ウェブサイトはウェブサーバというサーバが提供してくれているのですがこのサーバが悲鳴を上げている感じです。CPUの使用率は100%に張り付き、ロードアベレージという負荷を表す数値も三桁突入でてんやわんやです。ちなみにロードアベレージは一桁(コア数以下)が正常値です。インフラ屋(サーバ屋)さんとしては辛い状況でもあり楽しい状況でもあるので感嘆を漏らすところですね。

さて、なんにしてもこのままではまずいです。実際に夜になると重くて重くてウェブサイトが見れない状態です。このままではアクセス数にも間違いなく影響があります。そんななかでまずは手っ取り早く、簡単な手順で負荷を軽減する術について書いてみたいと思います。

 

さてところでウェブサーバというのはどんな動きをしてるんでしょうか。
ウェブサイトを見たいというユーザのブラウザからのリクエストがあった場合、適切な返答をレスポンスとして返してあげる、ウェブサーバとはそんな動きをしているんですね。
ここでのレスポンスは通常HTMLが返答されます。ユーザのブラウザはそのHTMLを表示してあげてるんですね。それでウェブサイトを閲覧することになります。
HTMLをレスポンスとして返答する、のですがwordpressのようなPHPを使ったプログラムの場合にはまずプログラムを解釈し実行する必要があります。プログラムの実行、これはサーバに負荷を掛けます。ですのでウェブサーバを軽くしてあげるにはこのプログラムの処理をいかに軽くするか、またいかに減らすかというのがキモになってきます。
今回はこの処理を減らす方向で進めていきます。

プログラムを実行せずにレスポンスのみを返答するためにはキャッシュ機能が用いられます。いろいろなところで目にするキャッシュです。キャッシュを使えばプログラムが実行されること無く、事前に用意されて置いたキャッシュを返答することであたかもプログラムが動いたかのように見えるんですね。おかげでウェブサーバはPHPの実行が減るので軽くなります。
キャッシュはとても便利なのですがデメリットもあります。それは即時性に欠けることです。キャッシュは事前に用意しておくものですのでリアルタイムに変動する無いように対しては使うことができません。これは注意が必要ですね。

今回はトップページのみをキャッシュすることにしました。google analyticsやapachetopなどでまずは現状のアクセス状態を解析してみました。サイト全体のアクセスに対してトップページだけで7%ほどのアクセスがありました。これをキャッシュを使って表示させようというわけです。7%分のプログラム実行が減るわけですから、7%多くの他のプログラムを実行する余地が生まれるのですね。7%が多いか少ないかという判断については難しいですが、1%未満ではないので今回はキャッシュさせることにしました。

キャッシュの方法は至って簡単です。一時間おきなど決められたサイクルにトップページを取得しそれを置いておくだけです。wordpressの場合ですとhttp://www.example.com/index.phpへアクセスしてそれを置いておけば良いです。
外部からアクセスされる場合、最初のスラッシュ以降は空欄で来る場合が多いです。先ほどの例ですとhttp://www.example.com/でアクセスされることが多いのですね。この場合ウェブサーバはhttp://www.example.com/index.htmlを読んで返答します。(実際にはサーバの設定によります)。index.htmlはphpじゃないのでプログラムは実行されずにHTMLを返答するだけなんですね。なのでとても軽いです。CPU負荷はかけません。キャッシュ万々歳ですね。

さて、実際のやり方です。
ウェブサーバにログインしてcrontabを編集します。crontabに以下のようなコマンドを登録します

0       *       *       *       *       yousan  /usr/local/bin/wget -O /home/yousan/public_html/www.example.com/index.html http://www.example.com/index.php

これで毎時0分にキャッシュを生成してくれます。wgetのパスなどが違う場合があります。その際にはwhich wgetなどしてパスを確認してください。wgetは-Oオプションで取得したファイルの置く位置を決めることができます。これでキャッシュをドキュメントルートの直下におけます。
これできっと軽くなるはずです。

最後にキャッシュがちゃんと効いているか確認してみます。themesにあるindex.phpへテストコードを埋め込んでキャッシュが効いているか確認します。


<!-- time <?php echo time(); ?> -->

上記のコードはヘッダーより下の安全なところに埋め込みます。phpで現在時刻を秒数で出力しているのですね。キャッシュが無い状態でアクセスすると上のコメント部分の時刻がアクセス毎に変動します。が、キャッシュを生成すると時刻がキャッシュ生成時の時刻になります。終わったら消しておきましょう。

最後に

wordpressは便利です。でも残念ながら重いです。月間で100万PVを越える辺りから限界に近くなります。ノーマルwordpressだとまず最初に直面する上限値かもしれません。wordpressにはいろいろなキャッシュプラグインがあるのでそういったプラグイン、またテクニックを駆使してアクセスを伸ばしてやる必要があります。プラグインにも公式が配布しているキャッシュシステムにも非常に有用なものがあるのですが今回は簡単なキャッシュをまずは取り入れてみました。よかったら使ってみて下さい。

コメントを残す