Apache 2.2.3+MySQL 5.0.95+WordPressでCPU 100%となる

シェアする

  • このエントリーをはてなブックマークに追加

スポンサードリンク

Apache 2.2.3でCPU100%

当ブログはさくらインターネットのVPS(仮想専用サーバー)を使っていますが、時々ApacheのCPU負荷が100%になってサーバーのアクセスができなくなることがあるようです。
先日もアクセス不可に見舞われたのですが、Uptime Robotを設定していたので、アクセス不可になった際に、通知メールが飛ぶようになり、すぐにCPU100%となっている状況を知ることができました。

後で、さくらインターネットのVPSコントロールパネルから「リソース情報」を見ると下記の状態になっていました。
image

この状態ではCPUが100%になっているのでユーザーからはアクセスできない状態になっていたようです。

スポンサードリンク

PHP Fatal error:  Maximum execution time of 30 seconds exceeded

該当時間のログを調べてみることにします。

Apacheのerror_logは以下の通りです。

パッとみたところ、PHP Fatal error:  Maximum execution time of 30 seconds exceeded が怪しいように見えますが、これはシロだと思います
PHPでは無限ループの対策のため、PHP実行処理のタイムアウトが設定されており、デフォルト値が30秒になっています。30秒自体はおそらくほとんどの処理では適当なタイムアウト値だと思われます。
/etc/php.iniファイルの中のmax_execution_time = 30 を変更すれば伸ばすことは可能ですが、今回のCPU100%問題について説明がつく修正ではないので止めておくことにします。
今回の現象は、恐らく、CPU100%となってしまったために、PHPの応答がなかなか返ってこなくなって結果として30秒のタイムアウト値を超えてしまったのではないかと考えられます。

スポンサードリンク

Out of memory: Killed process 32592, UID 27, (mysqld)

該当時間のシステムのログを調査してみます。
CentOSではシステムのログとしては、/var/log/messagesと/var/log/secureを参照します。
/var/log/secureには目立った障害は見られませんでした。

/var/log/messagesは以下の通りです。

うーむ。

Out of memory: Killed process 32592, UID 27, (mysqld) とか
httpd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0 あたりが怪しいところです。

推測すると、何らかの無限ループに入って、CPUやメモリを使い果たしてしまい、やむを得ずに、システムがApacheとMySQLを再起動しているように見えます。
LinuxカーネルにはOut Of Memory Killer(OOM Killer)という機能があって、メモリ浪費を行っているプロセスを自動的に止めるように動きます。

Apache Killer(CVE-2011-3192)が原因か?

2011年8月に当時、ほぼすべてのバージョンのApacheに存在する脆弱性が見つかりました(CVE-2011-3192)。

「Apache HTTP Server」には、サービス運用妨害 (DoS) の脆弱性(CVE-2011-3192)が存在します。

「Apache HTTP Server」は、Apache Software Foundation がオープンソースソフトウェアとして提供しているウェブサーバ用のプログラムです。 「Apache HTTP Server」には、HTTP リクエストの取扱いに問題があるため、サービス運用妨害 (DoS) の脆弱性(CVE-2011-3192)が存在します。 この脆弱性が悪用されると、運用中のウェブサービスを提供できなくなるなどの被害にあう可能性があります。

http://www.ipa.go.jp/security/ciadr/vul/20110831-apache.html から引用しています。

私の使っているApacheは、2.2.3と古いので怪しいと思い、脆弱性を確認してみました。
検証するために、apachepartial.pl というスクリプトを使います。
http://pastebin.com/NCDv9eTh
からダウンロードしてクライアントに置きます。

サーバーをいつでも再起動できる状態にしてテストして見ました。

Host does not seem vulnerable ・・・シロでした。

この種の対策を何も行っていなかったので、いかにもこの問題かと思ったのですが違いました。

1日いろいろと対策を考えましたが、今回は本件の原因解明を諦めて、代わりにApacheをnginxへ移行して様子を見てみようと思います。

2014.11.14 追記 nginxへ移行しました

CentOS 5のWordPressでApache 2.2.3からnginx 1.6.2へ移行手順

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です