Table of Contents
Apacheでトラフィック制御
- 出典
- Software Design 2007年 09月号
- テスト環境
- CentOS5 テスト用最小インストール手順参照。
- apacheバージョン
- 2.2系
- トラフィック量とコネクション数とかでアクセス制限する
- 以下のサードパーティモジュールを使う
- mod_bwshare
- mod_limitpconn
- mod_bw
mod_bwshare
特徴
- 1秒あたりの平均リクエストファイル数で制限
- 1秒あたりの平均トラフィック量で制限
- しきい値を超えたら制限1
- 管理画面あり(制限中クライアントやトラフィック量などを確認可能)
- コネクション数では制限できない!
導入
apxsでビルド
# unzip mod_bwshare-0.2.0.zip # cd mod_bwshare-0.2.0 # apxs -a -i -c mod_bwshare.c
httpd.confに以下の行があることを確認。
LoadModule bwshare_module /usr/lib/httpd/modules/mod_bwshare.so
再起動
# apachectl restart
設定
<IfModule bwshare_module>
<Location /bwshare-info>
SetHandler bwshare-info
Order deny,allow
Deny from all
Allow from 10.211.55.0/24
</Location>
<Location /bwshare-trace>
SetHandler bwshare-trace
Order deny,allow
Deny from all
Allow from 10.211.55.0/24
</Location>
<Directory /var/www/html>
BW_tx1debt_max 25
BW_tx1cred_rate 0.1
BW_tx2debt_max 3000000
BW_tx2cred_rate 2500
BW_subnet_limit net= 192.168.0.0/24 \
tx1rate = 80.00 files/min tx1max = 200 files \
tx2rate = 1000000 bits/sec tx2max = 10000000 bytes
</Directory>
</IfModule>
設定内容は以下。
- <Location /bwshare-info>〜</Location>でmod_bwshareの設定値と動作情報を表示する。
- <Location /bwshare-trace>〜</Location>でmod_bwshare動作において、記録されている各クライアントのカウント値や制限中情報を表示する。
- <VirtualHost>ディレクティブでBW_throttle_off 1を設定するとそのバーチャルホストを制限対象から外せる。2
- 制限を実施する各ディレクティブの意味
- BW_tx1debt_max/BW_tx1cred_rate
- リクエスト数/トラフィック量の上限を「ファイル数単位」で設定。
- debt_maxまでは無制限、それ以上はcred_rateに従って制限が解除される。
例) 25ファイルまで無制限にDL可能、それ以後は0.1ファイル/秒。 ⇒ 10秒に1ファイルしかDLできなくなる。(10秒待つ必要あり)
- 指定がない場合はデフォルトで20/0.133。
- BW_tx2debt_max/BW_tx2cred_rate
- リクエスト数/トラフィック量の上限を「バイト単位」で設定。
- debt_maxまでは無制限、それ以上はcred_rateに従って制限が解除される。
例) 3MBまで無制限にDL可能、それ以後は2.5KB秒。 ⇒ 1200秒待たないと次の3MBはDLできなくなる。
- 指定がない場合はデフォルトで3000000/2500。
- BW_tx1debt_max/BW_tx1cred_rate
制限事項
- 制限が開始されるとDLがロックされた感じ。(制限後のDLはエラーとなる)
- 制限をログれない。bwshare-traceで見ることしかできない。
- サーバ全体設定としてしか適用できない。3
- クライアントごとのカウント値を内部で持っているので負荷が。
- クライアントをIPで判断(プロキシからとかは同一になる)
- Loadするだけで有効になるっぽい。注意。
mod_limitpconn
特徴
- トラフィック量ではなく同時接続数で制限。
- コンテンツの種類(拡張子、MIMEタイプなど)による制限が可能。
- URLごとに制限が可能
- 制限をエラーログに記録
- .htaccessで設定可能
導入
# tar zxvf mod_limitipconn-0.22.tar.gz # cd mod_limitipconn-0.22 # apxs -a -i -c mod_limitipconn.c
httpd.confに以下の行があることを確認。
LoadModule limitipconn_module /usr/lib/httpd/modules/mod_limitipconn.so
再起動
# apachectl restart
設定
<IfModule limitipconn_module>
ExtendedStatus On
<Location /foo>
MaxConnPerIP 2
NoIPLimit text/*
</Location>
<Location /bar>
MaxConnPerIP 2
OnlyIPLimit audio/* video/*
</Location>
<FilesMatch "\.(zip|mp?g|iso)$">
MaxConnPerIP 1
</FilesMatch>
</IfModule>
- mod_limitipconnはmod_statusを使っているので"ExtendedStatus On"は必須。
- NoIPLimitで特定のファイルのみ制限の除外。OnlyIPLimitで特定のファイルのみ制限。
制限
- IPごとに制限の幅は設定できない、全てのIPに対して制限がかかる。
- クライアントをIPで判断(プロキシからとかは同一になる)4
mod_bw
特徴
- トラフィック量/コネクション数の両方で制限可能。
- ファイル拡張子やサイズでコネクション数を設定することが可能。→コネクション数だけ?
- IPアドレスやブラウザタイプ等で判断してクライアントごとにコネクション、トラフィックの制限可能
- ディレクトリごとの設定が可能。
- バーチャルホスト単位で設定可能。
導入
# tar zxvf mod_bw-0.8.tgz # cd mod_bw # apxs -a -i -c mod_bw.c
httpd.confに以下の行があることを確認。
LoadModule bw_module /usr/lib/httpd/modules/mod_bw.so
再起動
# apachectl restart
設定
設定例1
<IfModule bw_module>
BandWidthModule On
ForceBandWidthModule On
BandWidth all 1024000
MinBandWidth all 50000
</IfModule>
- "BandWidthModule On"で有効化
- "ForceBandWidthModule On"で全てのコンテンツを対象とする。5
- BandWidthディレクティブで、対象接続元とトラフィック量(バイト/秒)を指定。
- 対象はFQDN、ドメイン、IPアドレス、ネットワークアドレス、user-agentで指定可能、allで全て。
- トラフィック量を0にすると無制限。
- 条件が重ならないように注意すること。例えば
BandWidth 127.0.0.1 1000 BandWidth 127.0.0.1 0
とすると、最初の設定が勝つようになっている。この点に注意すること。 - なお、user-agentで指定する場合は以下。
BandWidth "u:^Mozilla/5(.*)" 10240
- "MinBandWidth"で最小トラフィック量を設定。ちょっとわかりにくいので、以下の例。
BandWidth all 100000 MinBandWidth all 20000
上記の場合、- 1クライアントからの接続であれば、MAX100KB/sに制限される
- 2クライアントの場合、MAX100KB/sの半分、50KB/sずつとなる。
- 3クライアントの場合は、33KB/sとなる。つまり、1IPアドレスからの接続の上限がBandWidthの指定ということになる。
- さらにクライアント数を増やしていき、6クライアントとなった場合、単純に計算すると16KB/s程度となるが、実際には20KB/s程度となる。これはMinBandWidthで20KB/sに指定してある場合、1IPからのクライアントがどれだけ増えたとしても、最低20KB/sは保証される、というわけ。
- なので必ずBandWidthと併せて設定しなくてはいけない。
設定例2
<IfModule bw_module>
BandWidthModule On
ForceBandWidthModule On
LargeFileLimit .iso 150000 100000
</IfModule>
上記の場合、拡張子が.isoのファイルで150MB以上のファイルサイズであれば100KB/sに制限がかかる。150MB以下であれば、制限がかからない。なお、ファイルサイズはKB指定なので注意!
設定例3
<IfModule bw_module>
<Location /foo>
BandWidthModule On
ForceBandWidthModule On
BandWidth 10.211.55.0/24 10000
MaxConnection 10.211.55.0/24 10
ErrorDocument 510 /errors/maxconexceed.html
BandWidthError 510
</Location>
</IfModule>
今度はLocationディレクティブの中に含めてディレクトリに制限をかけてみた。
- MaxConnectionでコネクション数の制限をかけている。MaxConnectionを使う場合はBandWidthで同じ接続元からの制限をかけておく必要がある。単にコネクション数だけの制限にしたい場合は、
BandWidth all 0
とすればオーケー。 - MaxConnectionを指定する場合はコネクション上限を超えた場合にエラーを表示するので、"ErrorDocument"と"BandWidthError"でエラーコードとエラー用のページを指定することができる。
制限
- クライアントをIPアドレスで判断する為、プロキシの場合は全て同一となる。
- 制限時のログが残らない。
その他
- 各モジュールごとに微妙に動きが違うので注意。
- ドキュメント嫁
- 実践で使ってみないとわからん。とりあえずは知っておくことが大事。
添付ファイル
- bwshare_i.jpg (58.0 kB) - kunkichi によって 2007/10/04 02:14:26 に登録されました。
- bwshare_t.jpg (36.5 kB) - kunkichi によって 2007/10/04 02:14:52 に登録されました。

