Apache2でmod_limitipconnを使う方法
ダウンロードツールを使って、多重ダウンロードや分割ダウンロードが行なわれることは非常に迷惑なことだ。サーバー管理者は、ネットワーク帯域の圧迫やハードディスクへの負荷増大に悩まされることになる。
そこで、この対策のために有用なものが「mod_limitipconn」だ。
mod_limitipconnは、Apache用のモジュールとして動き、1つのIPアドレスが接続できる最大値を制限することが出来る。例えば最大値を2とすれば、1つのIPアドレスから同時に並行してダウンロードできる数は最大2つとなる。
最大数以内ならば、mod_limitipconnは通信をスルーしてサーバー側に渡す。つまり通常と何ら変わりない処理となる。一方、最大数を超えた場合、mod_limitipconnは、HTTPステータスコード「503 Server Temporary Unavailable」を返すようサーバーに指示する。この結果、データは送信されずにダウンロードは失敗する。
肝心の効果のほどだが、それなりにディスクアクセスの量は減るようだ。実のところ、完璧に多重アクセスを防いでくれるわけではない。アクセスログを見ると明らかに多重アクセスにもかかわらず、素通りして200/206を返しているパターンがところどころに見受けられる。そのパターンは1秒間に数回のアクセスを行うものだ。どうやらあまりにも速い多重アクセスだと防ぎきることが出来ず、素通りさせてしまうようである。
mod_limitipconnは、多重か否かの判定を、現在接続中のIPアドレス一覧をApacheから取得し、その数を調べることで行っているが、おそらく取得するまでの時間に若干のタイムラグがあるのだろう。
つまり「効果てきめん」とまでは言えないが、導入するとしないとでは負荷にそれなりに違いが見受けられるので、やってみる価値はあると思う。
では早速インストールをしてみよう。想定するソフトウェア環境は以下の通り。
OS | RedHat Linux9 |
---|---|
HTTPサーバー | Apache2.x |
OSについては筆者が動作確認したものを載せた。おそらくApacheが動くのならば、他のLinux系・BSD系でも問題ないだろう。
Apacheのバージョンについては、2.xを使用する。1.xは取り上げない。
# apachectl -l |
# ./configure --enable-so # make install |
# wget http://dominia.org/djao/limit/mod_limitipconn-0.22.tar.gz |
# tar zxvf mod_limitipconn-0.22.tar.gz |
# cd mod_limitipconn-0.22 |
# make install |
# Example: # LoadModule foo_module modules/mod_foo.so LoadModule limitipconn_module modules/mod_limitipconn.so #AddModule mod_limitipconn.c |
# ExtendedStatus controls whether Apache will generate "full" status # information (ExtendedStatus On) or just basic information (ExtendedStatus # Off) when the "server-status" handler is called. The default is Off. # ExtendedStatus On |
<Directory "/"> #いろいろ </Directory> # mod_limitipconn Setting <IfModule mod_limitipconn.c> <Location /bin/data> MaxConnPerIP 2 </Location> </IfModule> |
# ab -n 10 -c 10 http://localhost/bin/data/test.jpg |
# tail -n30 access_log |
「<IfModule mod_limitipconn.c>」ディレクティブでは、以下の設定をすることができる。
MaxConnPerIP 2 |
NoIPLimit text/* |
OnlyIPLimit video/* image/* |
※NoIPLimit/OnlyIPLimitを指定せず、MaxConnPerIPのみ設定した場合は、ファイルの種類を問わずすべて拒否することになる。
通常の仕様では、拒否するときに503を返す。503は「サーバーが一時的に利用できない」という意味であり、ファイル自体は存在する(かもしれない)。そのため、一部のダウンロードソフトは503が返ってきたとしても動作を終了しようとせず、延々とリトライを繰り返すのだ。
これをやめさせるには、「ファイルはない、あきらめろ」と返答する必要がある。そのためには、HTTPステータスコード「404 Not Found」を返すのが効果的である。
残念ながらhttp.confの設定では行うことが出来ないため、ソースコードを直接いじって改造する必要がある。だが安心してよい。修正個所はたったの1つだけだ。設定ファイルをいじる感覚で誰にでも出来る。
#ls mod_limitipconn.c |
/* return 503 */ return HTTP_SERVICE_UNAVAILABLE; } else { return OK; } |
/* return 503 */ //return HTTP_SERVICE_UNAVAILABLE; /* return 404 */ return HTTP_NOT_FOUND; } else { return OK; } |
;
)を付けるのを忘れずに。
#cp .libs/mod_limitipconn.so /usr/local/apache2/modules |