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を有効にするのを忘れずに。) |