«

»

9月 07

Apacheの設定を欲張らない – 負荷が高くてもメモリ不足でダウンしないような設定

DoS攻撃に対する耐性の実験の前に、ふつーの負荷に耐える、ふつーの設定をすること。

これ、とっても大事です。

そんなApacheの設定の入れ方についてお話します。

といっても、まだちょっといじっていないので、暫定的な、参考程度の値だと思ってください。

目安程度にはなると思うんですけどね。

 

 

というかね、ためしにちょっと負荷をかけたら、うちのサーバがダウンしてしまいまして…泣きながら設定を変えました。

 

 

なお、環境は、CentOS 5.8 x64

Hyper-V下の仮想マシンでLinuxIC2.1導入済み。

CPUは物理的には E3-1220で、4コアを割り当て。

物理メモリの割り当ては 1GB です。

 

 

最初の設定はこんなかんじでした。(今回は、prefork しか変更していないため、それのみ紹介します)

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

たぶんだいたいデフォルトだったんだろうと思います。

 

ここに対して、別のサーバから次のように負荷をかけてみました。

apacheに付録でついてくる ab っていう負荷テストツールなんですが。

[root@attacker]# ab -k -c300 -n 10000 http://code.zobe.jp/

↑よい子のみんなはマネしないで!http://…のところは、おとうさん、おかあさんのサーバにしようね!

 

 

これを5秒だけ実行したところ。

 

まさかのサーバダウン。

Webがみられないだけじゃない。sshでも入れない。

コンソールからはいったれと思ったものの

コンソールからもログインできなくなっちゃっている様子

ちょっとまってね、ちょっとまってね…はい時間切れー!小学生かい!

 

重すぎて入れず。

 

 

なにが起きてるって、調べ方は省略しますが、

  1. 負荷テストツール ab により、Apacheに同時接続300が来る
  2. WordPress のプログラムが同時に300起動する
  3. メインメモリを消費し尽くす
  4. さらに不足した分は、HDDのスワップ領域に書き込まれる
  5. 数GBに及ぶHDDへのランダムな読み書きが…システム全体を高負荷状態に追い込み、なにもできなくする

 

 

となっているのです。

 

 

 

結局、さっきの設定を

<IfModule prefork.c>
StartServers 10
MinSpareServers 30
MaxSpareServers 40
ServerLimit 55
MaxClients 50
MaxRequestsPerChild 1000
MaxMemFree 1024
</IfModule>

 

ここまで減らしたところ、スワップ領域がほとんど使われずに動作し、負荷に耐えきることができました。

具体的には、攻撃を受けても、サーバダウンには至らず、Webもだいぶ遅いけどどうにか閲覧可能というところです。

 

 

上記設定、ちょっと欲張って

<IfModule prefork.c>
StartServers 10
MinSpareServers 30
MaxSpareServers 40
ServerLimit 60 (← 5増やした)
MaxClients 55 (← 5増やした)
MaxRequestsPerChild 1000
MaxMemFree 1024
</IfModule>

 

こうするだけで、メモリ不足でサーバダウンします。まじです。危ないです。

メモリの利用状況を考えて節約大事です。

 

 

なお、Web領域にWordPressを入れずに、単にhtmlと画像ファイルだけ、という状態を試したところ、

いっくら負荷試験ツールで負荷をかけても、Apacheの設定デフォルトのままで大丈夫でした。

やっぱ WordPress はそれなりに重いってーわけですね。

 

 

そろそろDoS攻撃関係の調査もしてみようと思います。

コメントを残す

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

次の HTMLタグおよび属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>