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