mod_mod: Apache module を動的にコンパイルして実行する Apache module
現在 WEBアプリケーションの開発言語といえばいわゆる Light Weight Langage が主流の様な気がしますが、C言語で WEBアプリケーションを書きた いと思った時、どのような方法があるでしょうか。一つはコンパイルした実行 オブジェクトを CGI として呼び出す方法、もう一つは apache module を書く という方法があると思います。
CGI の場合プロセス起動のオーバーヘッドがありますが apache module の 場合非常に高速です、にも関わらず apache module による WEB アプリケーショ ンの開発があまり流行っていないのはやはり、コード変更の度にコンパイルし なければならない事と、反映の際に apache を再起動しなければならない事が 原因ではないかと思います。
そこで、apache module っぽい C言語のコードをサーバー上で動的にコンパ イルし、実行する apacheモジュール mod_mod を作りました。
コンパイルや実行を行う際に新たなプロセスを起動するのではなく apache プロセス内で行います、また DocumentRoot 下のソースコードを変更すればダ イナミックに変更が反映されます。
今回は、この apache module mod_mod の使い方について紹介したいと思い ます。
注意: mod_mod は現在の所、実験的なソフトウェ アですので外部に公開している WEB サーバーで動作させるのは危険です。試し てみる時は公開されていない WEB サーバーでおためし下さい。
動作を確認した環境
- glibc 2.3.6 新しめのバージョン(2.5以上)などでは上手く動かないようです。
- apache 2.0.63 2.2.x 系は上手く動かないと思います。
- tcc 0.9.23 tcc のインストールについては「tcc について」の項目を参照下さい
インストール
mod_mod-0.1.tar.gz をダウンロードします。
% tar xvzf mod_mod-0.1.tar.gz % cd mod_mod-0.1 % ./configure --with-apache=/usr/local/apache2 --with-tcc=/usr/local/tcc # --with-apache と --with-tcc のディレクトリは適時変更して下さい。 % make % make install
これで apache のモジュールディレクトリ /usr/local/apache2/modules に mod_mod.so が配置されていればインストールは完了です。
設定
httpd.conf に以下のような設定を行います。
LoadModule mod_module modules/mod_mod.so AddHandler mod .c
これで、ファイル名に .c の拡張子を持つ C言語のソースファイルが mod_mod で処理されるようになりました。
Hello World
単純なサンプルコードを動かしてみます。DocumentRoot 下に以下のような hello.c というファイルを作成します。
hello.c#include "httpd.h" int handler(request_rec *r){ ap_rputs("<h1>Hello mod mod</h1>\n", r); return 0; }
このコードは apache module を作成したことがある方は見たことがあると 思います、apache module で HTTPリクエストを処理する handler 関数です。
apache を起動し、上記のファイルにアクセスしてみます。
% curl http://localhost/hello.c <h1>Hello mod mod</h1>
ソースコードの hello.c が動的にコンパイルされ、実行されました。
エラーハンドリング
設定ファイルのディレクトリーディレクティブに
ModDisplayErrors On
と書くことで、コンパイルエラーをレスポンスで返すようになります。
今後の課題
- コンパイルしたオブジェクトをキャッシュする。 現在の所、リクエストの度にコンパイルを行うので、非常にパフォーマンスが 悪いです。しかしコンパイル済みのオブジェクトをキャッシュするようにすれ ば本当の apache module と変わらないぐらいのパフォーマンスが出るのでは ないかと考えています。
- libtcc が exit する場合がある apache のプロセスが終了するので、プロセスモデルが worker の場合困った ことになりそうです。
上記の様な課題以外にもセキュリティ面での心配点がいくつかあり、現時 点でこれを使って WEB アプリケーションを書いて外部に公開しようという気 にならないのが現状です、しかし apache module を開発する際にこの mod_mod を使用して開発し、 最後に、本当の apache module としてビルドする、というような開発手法と しては実用的なのではないかと考えています。
tcc について
mod_mod ではソースコードのコンパイルに tcc: Tiny C Compiler を 使用しました。tcc は 小さくて軽い C のコンパイラでライブラリ化されてい るという特徴があります。
この tcc ですがビルド時に注意すべき点があります。
普通にビルドしたtcc をリンクした mod_mod で 前記したエラーハンドリ ングを試すと以下のようなエラーが出る場合があります。
httpd: `肉G係~HXX^HH|^V^H: Bad font file format
文字化けしている上に、Bad font file format と言うちんぷんかんぷんな エラーメッセージと共に Segmentation fault して落ちます。これは tcc 内 部の error() 関数とglibc の error 関数が競合している事が原因であること が解りました。
この問題を解決するためには、Makefile を以下のように変更し、プリプロ セッサで error 関数をリネームしてやる必要があります。
@@ -3,7 +3,7 @@ # include config.mak -CFLAGS=-O2 -g -Wall +CFLAGS=-O2 -g -Wall -Derror=tccerror ifndef CONFIG_WIN32 LIBS=-ldl BCHECK_O=bcheck.o