■Apache2.0/2.2系で帯域制限をしたい。

[概 要]

Apache1.3系のmod_bandwidthモジュールと同様に、Apache2.0/2.2系でも帯域制限をしたい。

[対 策]

Apache2.x系で帯域制限するモジュールとしては、「bwshare」(bwshareは2.2系は未対応?)というモジュールと「bw_mod」というモジュールがある。いずれもApacheへの過大なアクセスを制限するものであるが、その内容は似て非なるものである。
前者は、転送ファイル数やバイト数を監視し、設定量を超えると503エラーを返し一時的にアクセスを制限するというもので、帯域を制限するというものとはやや趣が異なるものである。一方、後者はApache1.3系のmod_bandwidthモジュールに近いもので、設定した転送量を制御するタイプのものである。どちらも動作はするが、前者は用途によっては活用できるかもしれないが、一定時間アクセスがロックされてしまうので一般的ではないことと、バグで簡単に対応できるDSOモジュールでの対応は転送量の設定を変更できないため、スタティックに組み込みまなければならないこと(Apacheのコンパイルしなおし、しかも多くの場合ファイルにパッチを当てないとmakeできない。)から、ここでは後者の「bw_mod」について説明する。
なお、Apach2.2はVersion : v0.7以降からサポートされていることと、モジュール名が変更になったりしているのでそれぞれについて示す。

[Version : v0.6以前]

  1. Ivn Project のサイトからアーカイブを適当なディレクトリにダウンロードしてきて、解凍する。

    # cd /usr/local/src
    # wget http://ivn.cl/apache/files/source/bw_mod-0.6.tgz
    # tar zxfv bw_mod-0.6.tgz

  2. DSOモジュールを作成するにはapxs が必要なので、予め httpd-devel または apache2-devel 等をインストールしておく。上記で解凍後、作成されたディレクトリに移動して、apxs または apxs2 等でDSOモジュールを作成、インストールする。(develパッケージの名称やapxsコマンドの名称はデストリによって違うので注意)

    # cd bw_mod-0.6
    # apxs -i -a -c bw_mod-0.6.c
    or
    # apxs2 -i -a -c bw_mod-0.6.c
    or
    # apxs2-prefork -i -a -c bw_mod-0.6.c

  3. 上記でhttpd.confにLoadModule ディレクティブが書き込まれるが、RedHat9(Fedora系?)の場合は、下記のようにworkerのところに書き込まれてしまうのでコメントアウトし、同じ内容を他のLoadModuleディレクティブの最後に追加する。


      (snip)

    LoadModule bw_module /usr/lib/httpd/modules/bw_mod-0.6.so

    <IfModule prefork.c>
    LoadModule cgi_module modules/mod_cgi.so
    </IfModule>

    <IfModule worker.c>
    LoadModule cgid_module modules/mod_cgid.so
    #LoadModule bw_module /usr/lib/httpd/modules/bw_mod-0.6.so
    </IfModule>

  4. 具体的な設定は、下記を参照して行う。

[Version : v0.7以降]

  1. Ivn Project のサイトからアーカイブを適当なディレクトリにダウンロードしてきて、解凍する。

    # cd /usr/local/src
    # wget http://ivn.cl/apache/files/source/mod_bw-0.7.tgz
    # tar zxf mod_bw-0.7.tgz

  2. aprがバージョン1の場合、コンパイルあるいはapache起動時にエラーがでるので、mod_bw.cの下記の部分を変更(赤字部分を追加)する。これは、バグと思われるのでaprのバージョンに関係なく本変更はやっておいてかまわない。


      (snip)

    #define VERSION "0.7"

    #include "apr_buckets.h"
    #include "apr_strings.h"
    #include "apr_atomic.h"
    #include "apr_lib.h"
    #include "apr_shm.h"
    #include "apr_version.h"
    #include "ap_config.h"

      (snip)


  3. DSOモジュールを作成するにはapxs が必要なので、予め httpd-devel または apache2-devel 等をインストールしておく。上記で解凍後、作成されたディレクトリに移動して、apxs または apxs2 等でDSOモジュールを作成、インストールする。(develパッケージの名称やapxsコマンドの名称はデストリによって違うので注意)
    v0.7では、ディレクトリ名やモジュール名が変更になっているので注意が必要。

    # cd mod_bw
    # apxs -i -a -c mod_bw.c
    or
    # apxs2 -i -a -c mod_bw.c
    or
    # apxs2-prefork -i -a -c mod_bw.c

  4. 上記でhttpd.confにLoadModule ディレクティブが書き込まれるが、デストリによっては、下記のようにworkerのところに書き込まれてしまうことがあるのでコメントアウトし、同じ内容を他のLoadModuleディレクティブの最後に追加する。


      (snip)

    LoadModule bw_module /usr/lib/httpd/modules/mod_bw.so

    <IfModule prefork.c>
    LoadModule cgi_module modules/mod_cgi.so
    </IfModule>

    <IfModule worker.c>
    LoadModule cgid_module modules/mod_cgid.so
    #LoadModule bw_module /usr/lib/httpd/modules/mod_bw.so
    </IfModule>

  5. 具体的な設定は、こちらもしくはアーカイブに同梱されているmod_bw.txtを参照して行う。
    簡単な説明を以下に示す。

    No. ディレクティブ概要 バージョン
    〜0.6 0.7〜
    1 BandWidthModule [On|Off]

    帯域制限する場合は、本設定を[On]にする。デフォルトは[Off]。

    例: BandWidthModule On
    2 BandWidthDebug [On|Off]

    デバッグ用のログ出力設定なので、デフォルトで無効なので本設定は不要。詳細ログが必要なら[On]にするが、大量のログがでるのであくまでデバッグ用とすること。

    例: BandWidthDebug On
    ×
    3 ForceBandWidthModule [On|Off]

    本モジュールは、デフォルトで全てのリクエストに対して機能する。しかし、何らかのリクエストだけを帯域制限したいなら本ディレクティブを[Off]とし、別途出力フィルタで処理するファイル種別を指定する。
    注:v0.7ではデフォルトが[Off]に変更になっているので、出力フィルタで処理するファイル種別を指定しなければ全てスルーになる。バージョンアップ時は注意。

    例: ForceBandWidthModule Off
        AddOutputFilterByType BW_MOD text/html text/plain

    4 BandWidth [From] [bytes/s]

    本パラメータで、転送要求元毎に転送量を bytes/s で指定する。転送要求元としては、ホスト名やドメイン名、IPアドレス、ネットワーク(i.e 192.168.0.0/24 or 192.168.0.0/255.255.255.0)、または全ての相手を指定できる。転送量は bytes/s で指定するが、0は無制限を意味する。

    例: BandWidth localhost 10240
        BandWidth 192.168.0.0/24 0
    5 MinBandWidth [From] [bytes/s]

    本パラメータで、転送要求元毎に最低転送量を bytes/s で指定する。転送要求元としては、ホスト名やドメイン名、IPアドレス、ネットワーク(i.e 192.168.0.0/24 or 192.168.0.0/255.255.255.0)、または全ての相手を指定できる。最低転送量は bytes/s で指定するが、これは、1クライントしかいない場合はBandWidthで指定した転送量で制御されるが、複数クライアントが存在するばあいは、各クライントは本設定値に制限され均等化される。本設定値の0は256bytes/sを意味し、-1はBandWidthで指定した転送量で制御される。

    例: BandWidth all 102400
        MinBandWidth all 50000

        1クライアント時は100kbytes/sであるが、複数クライントになるとそれぞれが50kbytes/sに制限される。

        BandWidth all 50000
        MinBandWidth all -1

        クライアント数に関係なく全てのクライアントに50kbytes/sで転送しようとする。
    6 LargeFileLimit [Type] [Minimum Size] [bytes/s]

    本ディレクティブは、ファイル種別やサイズによって転送量制御を行うことができる。[Type]では対象とするファイルの拡張子、または「* (全て)」を指定する。[Minimum Size]では帯域制御するファイルサイズをkbyte単位で指定し、最後のパラメータは転送量は bytes/s で指定する。

    例: LargeFileLimit .avi 500 10240

    500kbyte以上の.aviファイルは 10kbytes/sで転送量を制限する。
    7 BandWidthPacket [Size]

    本ディレクティブは本モジュールが使用するパケットサイズで、自動調整されるので基本的に設定不要。
    8 BandWidthError [Error]

    MaxConnectionを指定して最大値に到達したときに、デフォルトでは503エラーが返されるが、エラーコードをカスタマイズする場合に本ディレクティブを使用する。
    [Error]でエラーコードを指定するが、300から599の間のどんなエラーコードも使用できる。エラーコードを510として、オリジナルメッセージを出す例は以下のとおりである。但し、エラーメッセージのページサイズが1024バイト以下だとうまく表示できないことがあるようです。

    例: ErrorDocument 510 /errors/maxconexceeded.html
        BandWidthError 510
    9 MaxConnection [From] [Max]

    本パラメータで、転送要求元毎の最大接続クライアント数を指定する。転送要求元としては、ホスト名やドメイン名、IPアドレス、ネットワーク(i.e 192.168.0.0/24 or 192.168.0.0/255.255.255.0)、または全ての相手を指定できる。
     最大接続クライアント数に達すると、503エラーが返される(上記参照)

    例: BandWidth all 0
        MaxConnection all 20
     or
        BandWidth all 0
        BandWidth 192.168.0.0/24 10240
        MaxConnection all 20
        MaxConnection 192.168.0.0/24 5

    上記の設定は、バーチャルホスト毎に設定でき、ディレクトリ毎にも制御できる。

     <VirtualHost *>
      BandWidthModule On
      ForceBandWidthModule On
       BandWidth all 16384
       LargeFileLimit * 500 4096
       <Directory />
         LargeFileLimit * 100 1024
       </Directory>
    </VirtualHost>



Top Pageへ     戻る