自分で作ったApacheモジュールで使えそうなモジュールまとめ

「Apacheおもしれー!!」とか言いながら、一時期毎日のようにApacheモジュールを書いたりしていましたが、その度に他のモジュールが淘汰されていきました。

今日はそのような流れの中で生き残った、割と使えそうな自分の作ったモジュールを紹介したいと思います。どこにこだわったかを簡単に説明できれば良いなと思います。今回紹介するモジュールは、新しいApache Module RegistryでGruno氏(Apache httpd コミッタ兼mod_luaの中の人)のチェックを通っています。

mod_mruby

コード: https://github.com/matsumoto-r/mod_mruby

最近作っているApacheモジュールです。これはmrubyでApacheそのものを簡単かつ高速にコントロールできるモジュールで、Cで作ったモジュールに近いパフォーマンスでRubyの記述でApacheモジュールをかけるところが売りです。

また、ngx_mrubyも実装が進めば、WebエンジニアがWebアプリケーションを書く延長でWebサーバの拡張も必要になったら、そののりでWebサーバソフトウェアの差(今のところApacheとNginx)を気にすることなく、サーバ拡張ができちゃう、というところが個人的には面白いんじゃないかと思っています。そうなるように、mod_mrubyとngx_mrubyでの拡張記述はできるだけ同じになるようにしています。

このモジュールに関しては散々記事を書いてきたので、僕のこのブログを探ればわんさか情報がでてくると思います。

以降のモジュールはmod_mrubyでもかけるんじゃないかとも思っています。

mod_process_security

コード: https://github.com/matsumoto-r/mod_process_security

これは、レンサバにおける共有Webホスティング環境でバーチャルホストを使っていた場合、これまではCGIかつsuEXECで権限分離をしていました。しかし、CGIだとパフォーマンスが遅いし、モジュール版(DSOと呼ぶ)のPHPやPerlにすると、mod_ruid2は脆弱性があるしmod_suid2はCGIより遅くなって意味ないし、という問題を解決するために作りました。

CGIだろうとDSOだろうと一時的にスレッドを作って、そこで権限分離を行うのでパフォーマンス劣化は非常に少ないです。あと、CGIやDSOを一つのアクセス制御モジュールで処理できるのも楽で良いです。

このモジュールも論文書いたり記事書いたりしたので、それらも合わせてみると理解が深まると思います。

mod_vlimit

コード: https://github.com/matsumoto-r/mod_vlimit

これも、レンサバにおいてファイル単位やディレクトリ単位、あるいは、VirtualHost単位で同時接続数を設定したいときに必要となるモジュールです。これによって、任意のファイルに対する総接続数や、任意のファイルに対する同一IPからの同時接続数が制限できます。また、FilesMatchやDerectoryMatchなど、正規表現を使ったディレクティブと連携させることで、かなり柔軟な接続数制限が可能になります。

これは、preforkにおいて各サーバプロセスが一つの共有メモリ上のカウンターテーブルを共有するので、Apache全体として接続数制限ができるのも売りです。また、mod_vhost_alias等でシンボリックリンクで仮想ホストのディレクトリを管理している場合などに、Apacheはリンク先の実態のリアルパスを解釈できないのですが、それにも対応できるように、設定にリアルパスを記述することで実態のみに制限をかける事が可能です。

もう少し詳しい事は、下のmod_lalimiの賞で説明します。

このあたりの記事も参考にすると良いと思います。

mod_resource_checker

コード: https://github.com/matsumoto-r/mod_resource_checker

これも、レンサバにおいてCGIやプログラムのCPU使用時間を測定が難しい(ログに出力可能なレスポンス時間はスリープも含む)ため、サーバプロセスがあるファイルを処理するのに使ったCPU使用時間やメモリ使用量を直接計測してログに残すためのモジュールです。このモジュールによって、本来のCPU使用量が測定できるため、このログの統計から迷惑をかけているプログラムを特定の上、mod_vlimitでビシーっと制限をしてやる、という使い方が可能です。

このあたりの記事も参考になるでしょう。

mod_lalimit

コード: https://github.com/matsumoto-r/mod_lalimit

これは、ロードアベレージの値によってリクエストを正常に処理するかを判断するためのモジュールです。これ系のモジュールは世の中にもいくつかありますね。なんだ、そんなのいらねーや、と思うかもしれません。

しかし、世の中のモジュールにはできなくて、このモジュールにできることは、mod_vlimitと同様に、「mod_vhost_alias等でシンボリックリンクで仮想ホストのディレクトリを管理している場合などに、Apacheはリンク先の実態のリアルパスを解釈できないのですが、それにも対応できるように、設定にリアルパスを記述することで実態のみに制限をかける事が可能です。」です。

これが、意外と重要で、マルチドメインをシンボリックリンクによって実態であるユーザディレクトリにリンクを複数貼る(レンサバな方々であればこれだけで意味が分かるんじゃないでしょうか)ような状況において、同じ負荷をかけるプログラムなのに、ドメインによって制限がかかったりかからなかったりする場合があるのはよろしくないです。そこで、上記のように実態であるリアルパスに制限をかけられるようにしているので、リンクを張ろうがどうしようが、その実態へアクセスした場合は制限がかかります。

これって意外とチューニングにおいては重要です。

mod_request_dumper

コード: https://github.com/matsumoto-r/mod_request_dumper

少し疲れてきました…

このモジュールは、Apache内部の巨大なC構造体であるrequest_recの情報をJSON形式でDumpするモジュールです。テスト時に使ったりするのが良いと思います。アクセス解析にも使えそうで、色々用途は幅広い気がしています。

このあたりの記事を読んでみたりとか、MongoDBに入れて遊んでみた話を読むと良いと思います。

mod_load_monitor

コード: https://github.com/matsumoto-r/mod_load_monitor

これは、リクエスト時に指定したロードアベレージを超えていたり、下回っていたりすると、任意のコマンドを実行してくれるモジュールです。外部コマンドの実行になるので、コマンド実行時はCGI程度のボトルネックがあると思ってください。また、サーバ内の情報を微妙に環境変数に入れて扱えるようにしているので、それなり面白い事ができるんじゃないでしょうか。

このあたりの記事を読んでみたりとか、Redisと連携して遊んでみた記事もあります。

まとめ

書いてみると意外と多くなってしまって、レンサバ屋さんは色々工夫してるんだぞーとか、レンサバ屋さんへのメッセージのようになってしまいましたが、今後もレンサバ屋にとって有用な研究もしていきたいと思っています。