|
- | ||
|
|||
Apache用トラフィック制御モジュール/mod_bwshare
各クライアントホスト毎に1秒あたりの同時アクセス数・転送量を制限する。
機能
ap_check_accessで判定。log_transactionで転送量等を記録する。HTMLなど静的なコンテンツのみならず、CGIやPHPなどの動的なコンテンツも制御可能。
Apache全体で単一の設定のみが可能。
ステータス確認用のコンテンツハンドラ"bwshare-info"を使用して、各子プロセスの転送状態等を確認できる。 転送量およびアクセス数をクライアントホスト毎に計測し、超過した特定のホストからのリクエストのみを拒否できる。アクセス拒否時には、アクセス可能になるまでの時間をしらせる。超過した場合はStatus: 200でエラーメッセージを返す。
動作環境
Apache 1.3.x, Apache 2.0.x.
メンテナンス状況
2003年2月リリースのversion 0.1.3が最新。現在もApacheの最新リリースでの動作確認等が続けられている模様。
- 開発・メンテナンス
- Alan Kennington
- 配布元
- http://www.topology.org/src/bwshare/README.html
導入手順
プラットフォームによってはDSOで組み込むことができない*1。Apacheにスタティックリンクする必要がある。
パッケージの取得 http://www.topology.org/src/bwshare/bwshare-0.1.3.zip
$ cd /path/to/apache_1.3.*/ $ unzip bwshare-0.1.3.zipApacheのビルドとインストール
$ ./configure --activate-module=src/modules/bwshare/mod_bwshare.c $OTHER_OPTS $ make # make installビルドの際に
mod_bwshare.c:144: redefinition of `union semun'などのエラーメッセージとともに失敗する場合は添付のpatchを適用して次のようにビルドする。
mod_bwshare-have_union_semun.patch
$ patch src/module/bwshare/mod_bwshare.c < /path/to/mod_bwshare-have_union_semun.patch $ CFLAGS=-DHAVE_UNION_SEMUN ./configure --activate-module=src/modules/bwshare/mod_bwshare.c $OTHER_OPTS $ make # make install組み込んだ状態でデフォルトの制限が働くため、必ず設定を行うこと。
設定
BW_tx1debt_max TAKE1 OR_FILEINFO
BW_tx1cred_rate TAKE1 OR_FILEINFO
BW_tx2debt_max TAKE1 OR_FILEINFO
BW_tx2cred_rate TAKE1 OR_FILEINFO
tx1はリクエスト回数(頻度)。tx2は転送量(転送レート)
制御の手法と動作速度
転送量の管理と参照は共有メモリを介して行われる為、比較的高速。転送量管理テーブルへのアクセスも、ハッシュ表を用いてアクセスしている為比較的高速で。モジュールを組み込んだ状態でベンチマークテストを行うと約9%程度のスループット低下。
制約事項等
ステータス確認のツールの存在が、運用上非常に便利に感じられる。また、アクセス拒否時に独自のエラー頁でアクセス可能な時刻をしらせる等ユーザフレンドリー。ただしアクセス拒否時のエラーメッセージをHTTP Status 200で返すためエラーログには現れない。運用時には注意が必要。
モジュール組み込み時は機能のOff/Onができない。
ディレクトリ単位やVirtualHost?単位での制限ができない。膨大なクライアントホストから同時にリクエストを受け付けるサイトでの運用時には、転送量管理テーブルの拡張が必要な場合があるかもしれない。その場合は添付のpatchを適用し下記のようにモジュールをリビルドする。
mod_bwshare-n_remote_hosts.patch
$ patch mod_bwshare.c < /path/to/mod_bwshare-n_remote_hosts.patch $ CFLAGS=-DN_REMOTE_HOSTS=1000 ./configure $OPTS $ make # make install上記のコンパイルオプションにより転送量管理テーブルがデフォルトの400から1000に拡張される。
転送量管理テーブルが不足した場合、アクセスの古い順にエントリを破棄・再利用するため通常問題なく運用できる。しかしながらこのガベッジコレクション処理が頻発し、処理能力に悪影響を与えるようであれば同テ−ブルを拡張すべきと思われる。DSOとして組み込むことは可能だが設定値が反映されず、デフォルト値しか利用できない問題があった。mod_bwshareは設定値の保持に共有メモリを使用しており、この領域はApacheの親プロセス起動時に確保している。しかしApacheは起動時に下記のプロセスを経て、設定ファイルの読み込みと各DSOのロードとアンロード処理を行っているため、プラットフォームおよび実行ファイル形式によっては設定すべき共有メモリのポインタを(4)のステップで取得できない。
- 設定情報読み込み
- モジュール初期化 (shm確保)
- 設定情報破棄・DSOリロード
- 設定情報読み込み
- モジュール初期化 (shm確保)
この問題の修正は容易であるが今回はpatchの作成等は行わない。Apache本体にスタティックにmod_bwshareを組み込む場合は(2)で確保した共有メモリのポインタを参照できため、この問題は再現しない。*2
*1 Mac OS X 10.3.5ではDSOとして利用不可でした
*2 mod_bwshareはstatic変数を使用して初期化の回数を管理しており、スタティックリンクした場合は(5)の初期化処理はスキップされる。
Last-modified: 2010-04-25 (日) 13:34:22 (132d)