読者です 読者をやめる 読者になる 読者になる

mod_limitipconnで接続数制限

どうもmod_bwはアクセスされたタイミングではなくコンテンツを返すタイミングで帯域制御および接続数制御をしているようです。ゆえに、サイズが大きなコンテンツへの帯域制限には使えますが、重いCGIへのアクセス制限のような用途にはほとんど意味がないようです。
そこで、mod_limitipconnを検討してみることにしました。こちらは接続元IPアドレス毎に特定のURLへの接続数を制限するモジュールです。mod_bwのように特定のURLへの全体の接続数を制限することはできませんが、アクセスされたタイミングで接続制限を行う動作(Order Deny,Allowなどと同じフックを使用)なのでCGIの実行前に制限をかけられます。たとえば以下のような感じで設定します。

# 例1: /hogeへの接続元IPアドレス毎の接続数を3に制限する
LoadModule limitipconn_module modules/mod_limitipconn.so
<Location /hoge>
  MaxConnPerIP 3
</Location>

しかしやはり全体の接続数を制限することはできないので目的の用途には適していません。ソースを読んでみたところ、わりと簡単に改造できそうだったので全体の接続数を制限する機能を追加してみることにしました。
具体的には、MaxConnTotalというディレクティブを追加し、特定のURL(Directory, Locationなどで指定)に対する合計の接続数を制限できるようにしました。たとえば以下のように設定します。

# 例2: /hogeへの全体の接続数を10に制限する
LoadModule limitipconn_module modules/mod_limitipconn.so
<Location /hoge>
  MaxConnTotal 10
</Location>

MaxConnPerIPとMaxConnTotalを組み合わせて設定することもできます。

# 例3: /hogeへの接続元IPアドレス毎の接続数を3、
#      全体の接続数を10に制限する
LoadModule limitipconn_module modules/mod_limitipconn.so
<Location /hoge>
  MaxConnPerIP 3
  MaxConnTotal 10
</Location>

これで目的どおりの設定ができるようになりました。

また無責任パッチを転がしておきます。mod_limitipconn-0.22に対するパッチです。(勘違いをしていたので、なかったことにします。)

ところで、はてな記法でシンタクスハイライトが使えるのをはじめて知りました。Apacheの設定ファイルにまで対応してるとはすごい。