いつき over TCP / TimePlant

Apache - module

Apacheへのアクセス制限モジュールの組み込み
・速度制限
巨大なファイル置き場になるのを防ぐため、一定サイズ以上では速度制限をかけました。
方針としては、「大きなファイルは分割してUPして下さい」と言うことです。

具体的には、mod_bandwidthを導入します。
apache-contribなんとか.tar.gz(ringサーバー内)というのに入ってます。
/usr/local/apache/bin/apxs -i -a -c mod_bandwidth.cでコンパイル・インストールができます。
が、やっぱり最適化オプション-O2は欲しいところ。
/usr/local/apache/bin/apxsの$CFG_CFLAGSに-O2を追加しておきましょう。
my $CFG_CFLAGS = q( -O2 -DLINUX=22 -DUSE_HSREGEX `../apaci`);
かな。

次に設定です。
AddModuleの後に、BandWidthModule Onを追加します。(BandWidthを有効化)
でもって、速度制限したいDirectoryの設定の中で、
BandWidthPulse microseconds
bandwidthでデータを送信するアルゴリズムの時間をミリ秒で指定します。(多分)

BandWidth domain( or ip, or all) limit[bytes/s]
指定ドメインもしくはIPアドレス(network/maskフォーマット。例えば192.168.1.0/24)、あるいはallと指定するとすべてのアクセスに対して、limit[byte/s]の転送速度にします。
limitに0を指定すると、制限されません。(多分)

LargeFileLimit FileSize[KBytes] limit[bytes/s]
ファイルサイズがFileSize以上の時、limitの速度になります。

MinBandWidth domain( or ip, or all) limit[bytes/s]
指定ドメインもしくはIPアドレス(network/maskフォーマット。例えば192.168.1.0/24)、あるいはallと指定するとすべてのアクセスに対して、最小でlimit[byte/s]の転送速度にします。
limitに0を指定すると、256と同じになり、-1にすると他の設定が最小値になります。(多分)

の設定が出来るわけですが、(誰か、もっとましな訳を作ってくれ……)
今回は、LargeFileLimit 1000 1と設定しました。
1M以上のファイルを転送するときは、爆裂に遅くなりますね。(ホントはアクセスできなくするのが良いんだろうけど……)

この設定は、クライアントがアクセスしっぱなしになるので、(基本的には途中であきらめるだろうけど)やりすぎるとサーバーにアクセスできなくなります。

・コネクション制限
より多くのユーザーにアクセスしてもらえるようにするため、クライアントIPベースでのアクセス制限をかけました。
方針としては、「大量にコネクションが張れないように」です。

具体的には、自分(いつき)作の、mod_ipcountaccessを導入します。
/usr/local/apache/bin/apxs -i -a -c mod_bandwidth.cでコンパイル・インストールができます。

これも-O2で最適化しておきましょう。
readme読んだ人は分かるかと思いますが、このモジュールは、「共有メモリー」と「セマフォ」をサーバーの個数分(メインサーバー+VirtualHostで指定した分)使います。OSの制限に注意して下さい。
FreeBSDの初期状態のkernelだと、最大10個しか使えません。(取得できないと、アクセスはすべてエラーになります)

次に設定です。
絶対必須の物に、XUser/XGroupがあります。それぞれ、User/Groupと同じ物を指定して下さい。
今回は
User www
Group www
<IfModule mod_ipcountaccess.c>
XUser www
XGroup www
</IfModule>
と設定しました。

実際のコネクション設定ですが、
FromIPMaxOverErrorCode Code
コネクション要求が指定数より多い場合のエラーコードを設定します。
デフォルトは503です。
403/404などを指定しても良いかも?

FromIPMAX count
1IPからのコネクションの最大数をcount個に制限します。

FromIPMAXLongTimeCount count
指定時間以上コネクションを張っているIPに対して、最大のコネクション数をcount個に制限します。
ダウンロードしているユーザーにのみ、より強い制限をかけることが出来ます。

FromIPMAXLongTime time(sec)
FromIPMAXLongTimeCountを有効にするまでの時間を秒で指定します。

今回は
<IfModule mod_ipcountaccess.c>
FromIPMAX 5
FromIPMAXLongTimeCount 2
FromIPMAXLongTime 10
</IfModule>
と指定しました。(これは、メインとすべての制限するvirtualhostに対して行いました)
デフォルトでは、1IPから5個許可して、10秒以上コネクションが続いた場合(ほとんどの場合、これは大きいファイルのダウンロード)最大コネクションを2に設定するという事です。(最大コネクションを1にすると、そのDLが終了した直後に5に戻されます)

ここで注意して欲しいのが、~UserID/でアクセスされる場合、そのvirtualhostに対しての設定が適応されると言うことです。
つまりは、1つでも制限されていないvirtualhostがあると、そのドメインを利用して、上記制限を回避できてしまいます。
これを何とかする方法は、
UserDir disable としてしまって、~wwwroot/~userIDから~userID/public_htmlにシンボリックリンクを張ってしまうのが良いです。(~wwwrootで、FollowFymLinksを有効にするのを忘れずに。)


[ UnixInstallへ戻る | トップページへ戻る ]


ITUKI over TCP / TimePlant


このページ及びそれ以下のページに関するすべての著作権は桐原樹/NIにあります
画像、文章などのデータの全て、または一部の無断転載、複製、配布などは禁止です

(c)Copyright 1999-2001 Ituki Kirihara/NI
All rights reserved.