同時接続数&帯域制限[mod bw+mod limitipconn]
同時接続数制限と帯域制限の方法です。
これらが使えるモジュールとしては
mod_cband
mod_bwshare
mod_bw
mod_limitipconn
などがあります。
以前はそれぞれapt-getでインストール出来たみたいですが、今現在できるのはmod_bwのみのようです。
それぞれの特徴を大まかに言うと
◆mod_cband
同時接続数や帯域の制限を行い、制限を超えた場合の処理を設定することができます。全体、バーチャルホスト毎に制限を行うことができます。
◆mod_bwshare
1秒あたりの1IPからの同時接続数と帯域を制限することができます。 DoS対策や同時ダウンロード防止などに用いられます。
◆mod_bw
帯域制限のためのモジュールです。
◆mod_limitipconn
1IPからの同時接続数を制限することができます。 DoS対策や同時ダウンロード防止などに用いられます。
となります。この中でcbandが一番色々設定できていいのですが、公式サイトが死んでいるためまた後日にします。
またmod_bwshareはうまく機能しなかったのでこれもまた後日ちゃんと動かせるようになったら備忘録を書きます。
ということでmod_bwで帯域制限を行い、mod_limitipconnで同時接続数を制限します。
◆mod_bwの設定
◆インストール及びモジュールの有効化
$ sudo apt-get install libapache2-mod-bw
$ sudo a2enmod bw
Enabling module bw.
Run '/etc/init.d/apache2 restart' to activate new configuration!
$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
... waiting ...done.
◆モジュールの使用
いつものようにapacheのディレクティブ設定。昔はhttpd.confだったようですけど。
<IfModule mod_bw.c>
BandWidthModule On
BandWidth all 512000
MinBandWidth all -1
</IfModule>
まず一行目。これはモジュールを使用する際に必要です。多分default-sslの最初に<IfModule mod_ssl.c>があると思います。見ての通りSSLモジュールを使用する際に必要なわけです。
二行目、帯域制限をオン。
三行目、帯域の上限。
四行目、クライアント当たりの最低帯域。実は三行目だけだと「接続している全員を合わせてその上限」になってしまうので、クライアントが増えるとクライアント側はどんどん遅くなってしまいます。そこでこのオプションを使用。先ほどの上限があってもクライアント当たりの最低帯域を設定すれば(例えば102400)、その分は必ず出ます。また「-1」にすると、クライアント数に関係なく全てのクライアントに上限の帯域を与えられます(上の例なら512000)。
より細かいオプションの使用方法は以下参照
■Apache2.0/2.2系で帯域制限をしたい
しかしこれだけだと接続数の制限ができないので(このモジュールのオプションの接続数制限は、クライアント毎に設定できない。MaxConnection 10の場合、クライアントが10人で各々接続数1でも、クライアント1人で接続数10でも同じと認識。だからダウンローダ使用している人に全部取られる状況が起きる),mod_limitipconnを使用します。
◆mod_limitipconnの設定
◆インストールとモジュールの有効化
まずはダウンロード
公式サイト
展開後、Makefileを修正します。
APXS=/usr/bin/apxs2 ←apxsをフルパスで指定
APACHECTL=/usr/sbin/apachectl ←apachectlをフルパスで指定
パスが間違っているとインストールできないので、ちゃんとファイルがある場所をlocateやfindで確認して置きましょう。make installはroot権限で行わないとerrorが起きます。
$ sudo make install
$ sudo a2enmod limitipconn
$ sudo /etc/init.d/apache2 restart
<IfModule mod_limitipconn.c>
# 「/somewhere」への最大同時接続数を2に制限する。
# ただし、MIMEタイプが「text/*」のものは制限しない
<Location /somewhere>
MaxConnPerIP 2
NoIPLimit text/*
</Location>
# 「/foo」への最大同時接続数を2に制限する。ただし、
# MIMEタイプが「audio/mpeg」「audio/wma」のものは制限する
<Location /foo>
MaxConnPerIP 2
OnlyIPLimit audio/mpeg audio/wma
</Location>
# 拡張子がzip、mpeg、mpg、isoのファイルへの
# 最大同時接続数を1に制限
<FilesMatch "\.(zip|mp?g|iso)$">
MaxConnPerIP 1
</FilesMatch>
</IfModule>
僕の場合はFilematchのみで十分でした。
default-sslを修正後、apacheを再起動します。
追記:
mod_cbandは微妙でした。使い方をちゃんと把握してないのかもしれないですが、個人的には合いませんでした。
ソース:
接続数/帯域制限で無法なダウンローダを撃退
Apache2.2系で使えるモジュール
mod_limitipconn のインストールと設定