AWS(EC2)の無料枠でWordPressを運用していたら管理画面で固まったので対策しました

今日の17:41頃に管理画面を触っている最中にまたサーバがダウンしました。
セキュリティの対策もしたのに何故?という事で再び調査してみました。

まず、apacheのエラーログですが下記のようにメモリ不足のメッセージを確認する事ができました。

[Tue May 05 17:46:05 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Tue May 05 17:46:16 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Tue May 05 17:46:27 2015] [error] (12)Cannot allocate memory: fork: Unable to fork new process

sarのログからロードアベレージを確認したかったのですが、
応答しなくなった時間帯のログがすっぽりと抜けており確認する事ができませんでした。

sendmailのログには下記のようにロードアベレージが10を超えている旨のメッセージが出ています。
May 5 17:46:59 ip-10-0-0-xxx sendmail[2111]: rejecting connections on daemon MTA: load average: 12
May 5 17:47:15 ip-10-0-0-xxx sendmail[2111]: rejecting connections on daemon MTA: load average: 13
May 5 17:47:31 ip-10-0-0-xxx sendmail[2111]: rejecting connections on daemon MTA: load average: 13

不正アクセスの形跡は確認できませんでした。
この事から単純にWordPressを無料枠のEC2で運用するにはメモリが足りないという結論に至りました。

対策としては、メモリの増強をすれば済む話ですがたかだか1日数十PVしかないサイトでお金を掛けるのは嫌だったので
apacheのチューニングで対処する事にしました。

まず、apacheのプロセスのメモリ消費量を確認します。
1プロセス当りおおよそ60MB 程度使われています。

root@ip-10-0-0-139 conf]# ps aux | grep httpd
root 2384 0.0 1.1 368008 11976 ? Ss 18:20 0:00 /usr/sbin/httpd
apache 2387 0.1 7.3 438144 74748 ? S 18:20 0:00 /usr/sbin/httpd
apache 2388 0.0 0.8 368988 8464 ? S 18:20 0:00 /usr/sbin/httpd
apache 2389 0.1 5.5 414488 56444 ? S 18:20 0:00 /usr/sbin/httpd
apache 2390 0.2 7.2 437844 74308 ? S 18:20 0:00 /usr/sbin/httpd
apache 2391 0.2 7.3 438888 75464 ? S 18:20 0:00 /usr/sbin/httpd
apache 2392 0.1 5.7 421760 58360 ? S 18:20 0:00 /usr/sbin/httpd
apache 2393 0.2 7.2 436644 73592 ? S 18:20 0:00 /usr/sbin/httpd
apache 2394 0.0 2.9 387956 30268 ? S 18:20 0:00 /usr/sbin/httpd
root 2475 0.0 0.0 110404 864 pts/0 S+ 18:25 0:00 grep httpd

だいたい60MB位だったので1000Mの物理メモリと照らし合わせて計算。

apacheのデフォルトの設定は下記でした。
仕事では結構なアクセスのあるサイトを見ているのでこんなもんか~と思っていたのですが、
無料の1GBメモリでWordPressを運用するには大きすぎる値です。

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

</IfModule>

サーバの物理メモリ量 > 上記で確認した1httpdプロセスあたりのメモリ使用量×MaxClient数
+他のプロセスが使うであろうメモリ使用量
となるようにMaxClient数を設定します

apacheを落とした状態で200MB程度消費していたので少し余裕を持たせて
メモリの総使用量を60MB×10MaxClient+200MB(OSなど)=800MB

くらいで行く事にしました。
設定値は下記のようにしました。

 

<IfModule prefork.c>
StartServers 1
MinSpareServers 2
MaxSpareServers 4
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 100

</IfModule>

ServerLimit と MaxClients は同じ値を設定します。

各パラメータの意味は
StartServers: 最初に起動する子プロセスの数
MinSpareServers: 待機する子プロセスの最小数
MaxSpareServers: 待機する子プロセスの最大数
MaxClients: 生成する子プロセスの最大数
MaxRequestsPerChild: それぞれの子プロセスが扱うリクエスト数の制限数
です。

これでしばらく様子を見てみようと思います。

Comments are closed.