mod_limitipconn とは
IP アドレス単位で接続数の制限をするだけのモジュールです。
帯域制限は行いません。
また、今のところ IP アドレスを "限定して" の制限は行えない模様。

[ from README ]

The limits defined by mod_limitipconn.c apply to all IP addresses connecting to your Apache server.
Currently there is no way to set different limits for different IP addresses.
[ from README 意訳 ]
mod_limitipconn.c で指定された制限は、apache サーバーに接続する全ての IP アドレスに適用されます。
現在、IP アドレス限定の設定をする方法はありません。
インストール
ソースのダウンロード
http://dominia.org/djao/limitipconn.html から必要なモジュールをダウンロードしておきます。

モジュールのコンパイル
apache が DSO (Dinamic Shared Object) をサポートしているか否かで設置方法が変わってきます。
出来る限り apache を --enable-module=so オプション付きで configure したほうが良いでしょう。

apache が DSO をサポートしている場合
mod_limitipconn のソースを展開したディレクトリで以下のコマンドを実行。
% make
% su
# make install
作成された mod_limitipconn.so は、自動的に /usr/local/apache/libexec/ にコピーされます。

このあとは httpd.conf の設定を行ってください。

apache が DSO をサポートしていない場合
apache のソースは既に展開されているものとし、mod_limitipconn の展開場所も apache のソースを展開した場所と同じ場所に展開することを前提に説明します。

  1. apache のソースにパッチを当てる
    以下のように apache のソースにパッチを当てる必要があります。
    % cd apache_1.3.24
    % patch -p1 < ../mod_limitipconn-0.04/apachesrc.diff
    % cp ../mod_limitipconn-0.04/mod_limitipconn.c src/modules/extra/
  2. apache のコンパイルをしてインストール
    オプションが --add-module ではない ところに注意。
    他にもモジュールを組み込んでいる場合は、そのモジュールの手順通りに行います。
    (大抵は configure 時に --add-module でカタがつく)

    % ./configure --activate-module=src/modules/extra/mod_limitipconn.c --with-forward
    % make
    % su
    # make install
設定
mod_limitipconn の定義は、mod_bandwidth のように <Directory> ディレクティブ内で定義するのではなく、<VirtualHost> ディレクティブもしくはサーバー全体、.htaccess で定義します。

▼mod_limitipconn 独自のディレクティブ
各ディレクティブの説明を以下に記します。
  • MaxConnPerIP
    書式例:MaxConnPerIP <num>
    初期値:なし
    記述箇所:VirtualHost ディレクティブ内 / .htaccess 内 / サーバー全体設定内

    最大接続数を指定します。
    0 で無制限になります。
    同じ IP アドレスから指定した接続以上に接続を行おうとすると、クライアントに 503 エラーを返します。

    例) 接続上限を IP アドレス毎 3に設定
    MaxConnPerIP 3

  • OnlyIPLimit
    書式例:OnlyIPLimit <mimetype> (<mimetype>...)
    初期値:なし
    記述箇所:VirtualHost ディレクティブ内 / .htaccess 内 / サーバー全体設定内

    制限する mime type (ファイル形式) を指定する。
    ワイルドカードが使用できる。
    複数指定する場合は、スペースで区切って指定する。
    mimetype は apache の mime.types を参照。

    例-1) MPEG 系と WMA を制限する。
    OnlyIPLimit audio/mpeg audio/wma

    例-2) オーディオ系全てを制限する
    OnlyIPLimit audio/*

  • NoIPLimit
    書式例:NoIPLimit <mimetype> (<mimetype>...)
    初期値:なし
    記述箇所:VirtualHost ディレクティブ内 / .htaccess 内 / サーバー全体設定内

    OnlyIPLimit とは逆に、指定したファイル形式は制限しないようにします。
    それ以外のファイルはすべて制限されることに注意。
    そのほかの仕様は OnlyIPLimit に同じ。

▼httpd.conf に記述する場合
mod_limitipconn 独自のディレクティブに関しては「▼mod_limitipconn 独自のディレクティブ」を参照してください。

# DSO サポートの場合は必要
LoadModule limitipconn_module libexec/mod_limitipconn.so

<IfModule mod_limitipconn.c>
# 指定した apache "仮想ディレクトリ" 直下全てを制限対象にする。
# <Location> のディレクトリは <Directory> で指定されたディレクトリ
# ではなく、<Directory> をルートとしたディレクトリを指定することに
# 注意。
# 制限するディレクトリは <Location> を複数指定することにより他のデ
# ィレクトリの制限も行うことが出来る。
# VirtualHost を使用している場合は <VirtualHost> ディレクティブ内
# に記述すること。

    <Location />
        # 最大接続数 (1〜)
        # 0 で無制限

        MaxConnPerIP 0
       
        # 制限対象のファイル
        #
        # 複数ある場合はスペースで区切る。
        # OnlyIPLimit audio/mpeg audio/wma
        #
        # ワイルドカード使用可能
        # OnlyIPLimit audio/*

        OnlyIPLimit audio/mpeg
    </Location>
   
    <Location /mp3>
        MaxConnPerIP 5
       
        # 制限対象外のファイルを指定する。
        # これ以外のファイルは制限対象にはいるので注意が必要。

        NoIPLimit audio/mpeg
    </Location>
</IfModule>

  • LoadModule と AddModule は、DSO をサポートした apache の時に定義します。
    そのとき、AddModule は場合によっては定義は不要です。
    定義して
    [xxx xx xx xx:xx:xx xxxx] [warn] module mod_limitipconn.c is already added, skipping
    Syntax OK
    と出たらコメントアウトしてかまいません。
  • <Location> で指定するディレクトリは、<Directory> で指定したディレクトリをトップディレクトリとした apache 仮想ディレクトリを指定します。
  • 複数のディレクトリを定義する場合は <Location> を複数定義することで可能です。
  • 制限は httpd.conf だけではなく、.htaccess で行うことも可能です。
  • バーチャルホストを構築している場合は、<VirtualHost> ディレクティブ内で <Location> を定義してください。
    もし VirtualHost ディレクティブ外で定義すると、全てのサーバーに対して制限がかかります。
    もしくは .htaccess で定義することも可能です。

[ Tips ]
access_log には接続拒否されたログも残るので、access_log がものすごいことになります。
もし接続拒否されたログを access_log に残したくない場合は、access_log の CustomLog 定義を下記のように変更します。

CustomLog /usr/local/apache/logs/access_log common env=!LIMITIP

env=!LIMITIP で mod_limitipconn で接続拒否されたログを残さないようにする。
error_log も同様にものすごいことになるので、error_log でも接続拒否されたログを残したくない場合は、同様に env=!LIMITIP を付けます。

▼.htaccess に記述する場合
mod_limitipconn 独自のディレクティブに関しては「▼mod_limitipconn 独自のディレクティブ」を参照してください。

<Limit GET>
    <IfModule mod_limitipconn.c>
        MaxConnPerIP 2
        OnlyIPLimit image/bmp
    </IfModule>
</Limit>
MaxConnPerIP、OnlyIPLimit、NoIPLimit 以外はそのまま .htaccess 内に記述します。
httpd.conf サンプル