VirtualHost単位で同時接続数制限できるapacheモジュール

 

 

 

 

[Warning]

より効率のよい同時接続数制限モジュールができたので、上記のページを参考にして下さい。

[/Warning]

 

 

 

 

[note]

[/note]

またapacheモジュールを作ってみた。

今回は、IP単位やファイル単位で同時接続数制限を実現するapacheモジュールであるmod_limitipconnを作り替えた。
ほぼ丸々書き換えなので、patchにしても意味なかった。

まずは、mod_limitipconnの下記問題点を改善した。

  • VirtualHostに対応していない
  • シンボリックリンクを含むドキュメントルートに対応していない
    • 二つのVirtualHostのドキュメントルートが同じディレクトリにリンクを張っていた場合、高負荷をかけるCGIが存在した場合、二つのVirtualHostで共通することになるが本当のリアルパスで制限できず、ドメイン毎に制限かけなくてはならない。
    • ドメインエイリアスなどをとった場合に、システム的に契約ドメインのドキュメントルートにドメインエイリアス用のリンクをはる場合などがあるため、契約ドメイン単位で制限をしたい。
  • 不要な機能が多い(OnlyIPLimit、NoIPLimitなどのMIMEタイプの制限)
    • 殆どの場合、Files・FilesMatch・Directory・DirectoryMatchなどで対応できる。

改善による機能としては、

  • VirtualHostに対するIP単位での同時接続数制限
  • VirtualHostに対する同時接続数制限(VirtualHostのMaxClients)
  • 引数にリアルパスを指定することにより、シンボリックリンクを含むドキュメントルートにも対応
  • 不要な機能を削除し、シンプルな設定を実現
  • .htaccess対応
  • error_logに出すと顧客に制限がばれちゃうので、システム管理者が見れるところにログ出力

である。

続きを読む

Zabbix API 同時にログインしたらapache+MySQLがループするバグ

説明するまでもない、次世代の統合監視を担うオープンソースの代表格であるZabbix。ちょっと調査をする必要があったので、色々APIを試したりしていたときに発見した現象。

同時にZabbixAPIを叩きに行ったさいに、apacheとMySQLが高負荷状態に。その状態でWEBブラウザから他のクライアントがログインを試みてもタイムアウトになる。なんだーなんだーと思って調査してみたら、ログイン時にログを残す時のログID取得処理でバグがあった。

調査の内容は以下。

例えば、APIのクライアントから同時にZabbixAPIを叩きにいくと(zabbix-host-status-test.plは自分自身の監視を有効化したり無効化したりするスクリプト)

./zabbix-host-status-test.pl -m on & ./zabbix-host-status-test.pl -m on &

すると、API側のapache+mysqlがループに入り高負荷になる。

続きを読む

Linuxでシンボリックリンクを含んだパスを正しいパス(realpath)に変換する

■ realpath_for_fs() [Download]
・シンボリックリンクを含んだ絶対パスを安全にrealpathに変換

しばしば、シンボリックリンクを含んだ絶対パスをシンボリックリンクを含まない絶対パス(realpath)としてみたい場合がある。

特に、apacheモジュールを実装する上で、apacheはシンボリックリンクをrealpathに解析した上で、Directiveを見てくれないため、realpathでDirectiveを書いていても、シンボリックリンク経由でアクセスがあった場合は、Direvtiveのパスは無視される。

パスのBaseネームがシンボリックリンクであれば、symlinksコマンド等で調べることができるが、絶対パスの途中にシンボリックリンクが含まれている場合はそう簡単には行かない。

続きを読む