Amazon EC2のMicro InstanceでWordPressを使うと、時々データベース確立エラーが起きるので対処した

Amazon EC2のMicro InstanceでApache + MySQL + PHP + WordPressという構成でブログをやっているのだが、時々データベース確立エラーが起きる。原因が分かったので対処した。一応、解決はしたが、どうにも不満が残るのでまた試行錯誤するつもり。

原因

データベース確立エラーはいつも起きる訳ではなくて、たまに起きる。データベース確立エラーが起きる原因を調べてみたところ、WordPressにアクセスが集中した時にMySQLがメモリ不足で落ちていた。

対策

対策として以下のことを行った。

  • MySQLの最大接続数を調整する
  • ハードディスク上にスワップ領域を作成する
  • ApacheのMPMをPreforkからWorkerに変更する

以下、項目別に説明する。

MySQLの最大接続数を調整する

MySQLの設定ファイルにあたる/etc/my.cnfを編集する。
my.cnfのmax_connectionsの項目を以下のように設定する。

max_connections = 10

デフォルトでは大口の設定になっているのでマシンのスペックに合わせてなるべく小さく変更した。

ハードディスク上にスワップ領域を作成する

Amazon EC2のMicro Instanceではデフォルトではスワップ領域は無いので新たに作成する必要がある。
以下を実行することで1GBのスワップ領域を作成することができる。

dd if=/dev/zero of=/swapfile bs=1M count=1024

スワップ領域が作成されているかどうかはfreeコマンドで確認ができる。Swap:の項目に容量が表示されていれば設定が成功している。
 
スワップ領域の確認

ApacheのMPMをPreforkからWorkerに変更する

ApacheのMPMをPreforkからWorkerに変更すると、Apacheのメモリの使用量を抑えることができる。PHPを使用したシステムではApacheのMPMはPreforkが推奨されている。WorkerではPreforkとの機構の違いからスレッドセーフではないモジュールが動かない点に注意。
 
まずは/etc/sysconfig/httpdにMPMの設定をする項目があるので以下のように設定する。

コメントアウトされているので#を削除するだけで大丈夫なはず。

HTTPD=/usr/sbin/httpd.worker

Apacheを/etc/init.d/httpd restartなどで再起動し、MPMがWorkerに切り替わっているかを以下のコマンドで確認する。

$ apachectl -V | grep 'Server MPM'

Server MPM: Workerと返ってくれば切り替えが完了している。
 
上記で説明した通り、スレッドセーフではないモジュールが動かない等の問題がある場合はPHP-FPMを導入することで解決することができる。私の環境ではPHPをインストールした時点でPHP-FPMも一緒に入ったようで、PHP-FPMの起動設定をするだけで大丈夫だった。今のところWordPressでは問題なく動作している。

まとめ

上記3つの設定をしたことでアクセスが一時的に集中した場合でもMySQLが落ちることはなくなったが、一時的にアクセスが集中すればサイトの表示が動作的に重くなるし、平常時のブログへのアクセスが以前よりも時間がかかるようになってしまった。

解決策を探したところ、Amazon EC2のMicro InstanceでWordPressをやるならサーバーソフトウェアはApacheよりもNginxの方が良いようだ。ベンチマークを見ても分かるようにNginxはPHPとの相性が良いことに加え、Nginxのリバースプロキシキャッシュによってサーバーへの負荷を大幅に軽減することが可能だ。
 
こちらでWordPress用にカスタマイズされたAmazon EC2のAMI(起動イメージ)が無償配布されていたのでこれを使うのが一番簡単なのかなと思う。

参考
Apache マルチプロセッシングモジュール(MPM):Prefork と Worker の違い
AWSのEC2のMicroインスタンスでMySQLが落ちる
apache で fcgid,fastcgi(PHP-FPM) を使うなら PreforkからWorkerへ切り替えるべし。
AWS + 網元で、超高速 WordPress を手に入れよう、そうしよう | 8bitodyssey.com