Apacheモジュール開発記 その0

突然、Apacheのモジュールを作りたくなった。別に必要に迫られたわけではない。単なる趣味である。

そもそもApacheが単独で使われることは殆ど無い。Apache単独では、Perlで書かれたCGIスクリプトを実行することすらできない。Apacheは、モジュールをインストールすることによって多機能になるのである。有名なモジュールとしてはmod_dir、mod_ssl、mod_cgi、mod_userdir、mod_perl…などが挙げられる。

先ほど挙げたモジュールは最初から提供されているものだが、これが全てではない。Apacheのモジュールは自分で作ることも出来る。例えばmod_uploaderは、よくあるアップローダApacheのモジュールにしたものである。Perlphpを使ったアップローダがあるにも関わらずApacheモジュール版が作られたのは、Apacheのモジュールに次のような利点があるからである。

  • 高速
  • 省メモリ

こりゃもうやるしかないっすよ。「高速」とか「省メモリ」って、まさに厨をワクワクさせる単語のオンパレードじゃないですか。

開発に必要な道具

幸いなことにxorはDebianを使っていたので、必要なパッケージはapt-get installでほぼ全て手に入った。使用しているApacheのバージョンは2なので、1.3系のパッケージを使ってはいけない(使っても正しく実行されない)。

まず、apxs2が実行できるかどうかを確認する。実行できない場合はapt-get installで

  • apache2-prefork-dev
  • apache2-threaded-dev

というパッケージのいずれかをインストールしなければならない。使用するのはどちらか片方だけである。どちらをインストールするかは、Apacheのプロセスのモードによって決定する。Apacheのプロセスを調べるにはapache2 -Vと入力する。すると、

$ apache2 -V
Server version: Apache/2.2.X (Unix)
Server built:   AAA 99 200X 99:99:99
Server's Module Magic Number: 99999999:9
Server loaded:  XXX 9.9.9, XXX-Util 9.9.9
Compiled using: XXX 9.9.9, XXX-Util 9.9.9
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
:

となる(http://d.hatena.ne.jp/j7400157/20070612/1181574944から拝借)。この例の7行目に「Server MPM : Prefork」と書いてあるのがお解りだろうか。この場合はapache2-prefork-devをインストールする。そうではなく、例えば

$ apache2 -V
Server version: Apache/2.2.X (Unix)
Server built:   AAA 99 200X 99:99:99
Server's Module Magic Number: 99999999:9
Server loaded:  XXX 9.9.9, XXX-Util 9.9.9
Compiled using: XXX 9.9.9, XXX-Util 9.9.9
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
:

のような場合にはapache2-threaded-devをインストールする。

# apt-get install apache2-****-dev

以上によってapxs2というシェルスクリプトがインストールされているはずである。

apxs2でひな形生成〜コンパイル〜インストール

apxs2はすさまじく万能なモジュール開発支援プログラムである。ひな形の生成からコンパイル・インストールまで一通りのことを全てやってくれる。ここではmod_infotechという名前のモジュールを作ってみることにする。

最初にひな形の作り方からである。ひな形を作るディレクトリにて

$ apxs2 -n infotech -g

とやることで、infotechというディレクトリが作られるはずである。このディレクトリの中にはMakefile・modules.mk・mod_infotech.cという3つのファイルが入っているはずだ。このmod_infotech.cこそがmod_infotechのソースコードである。

次にmod_infotech.cのコンパイルである。Makefileがあることからも解るとおりmakeすればコンパイルされるが、apxs2を使うことでコンパイルしたファイルをApacheモジュールのディレクトリにコピーするところまでやってくれる。というわけで

# apxs2 -i -a -c mod_infotech.c

とやる。これでコンパイル自体は完了だ。なお、Apacheモジュールのディレクトリにコピーする際にはroot権限が必要である場合が多い。その場合はこのコマンドもroot権限で行わないと途中で失敗する。

最後にApacheにこのモジュールをインストールするところである。Apacheのモジュールの設定は全て/etc/apache2/mods-available(ここに無かったらfindとgrepを駆使してmods-availableを探してください)に保存されている。ここにinfotech.loadとinfotech.confというファイルを作成する(touchでOK)。次にinfotech.loadに以下のような記述を行う。

LoadModule infotech_module /usr/lib/apache2/modules/mod_infotech.so

infotech.confには次のような記述を行う。

<Location "/infotech/">
  SetHandler infotech
</Location>

最後にApache2をRestartする。

# apache2ctl restart

これでhttp://localhost/infotech/にアクセスすると、The sample page from mod_infotech.cと表示されるはずである。