Apacheのモジュールを作成するときのポイントなどをまとめる。

#contents

*汎用情報 [#h8ab2a6e]
 Apacheモジュールを作成するのに必要なコマンドはひとつだけ。それは、apxs2 だ。~
 これだけで、テンプレートの作成、インストールなどができる。~

**テンプレート作成 [#p568a823]
 0から始めるより、テンプレートがあった方がやりやすい。以下のようにして、テンプレートを作成する。
 $ apxs2 -g -n test
 これで、カレントディレクトリに test ディレクトリが作成される。
 $ ls -l test
 -rw-r--r-- 1 user group  938 2008-12-12 14:14 Makefile
 -rw-r--r-- 1 user group 2046 2008-12-12 14:14 mod_test.c
 -rw-r--r-- 1 user group  148 2008-12-12 14:14 modules.mk
 ただ、このままだと使いにくかったのと、Debianのディレクトリ構成では自動的な設定ファイル変更が出来なかったので、少し変更。~
 まず、modules.mkは削除。そして、Makefile も以下のようにシンプルに変更。
-Makefile
 CC=gcc
 OPT=-O3
 COPT=$(OPT) -Wall -Wcast-qual -Wwrite-strings -I/usr/include/apache2 -I/usr/include/apr-1.0
 
 all: mod_counter.o
 
 mod_counter.o: mod_counter.c
     $(CC) $(COPT) -c $< -o $@
 このままでも特に問題はないが、コンパイルオプションだけ変更する。
-Makefile(追加)
 DEFS=-O3 -Wall -Wcast-qual -Wwrite-strings

**コンパイル&インストール [#z65ac822]
 コンパイルは簡単。make コマンドを実行するだけ。エラーがなければ、次はインストールする。~
 インストールの前に、関連ファイルを作成する。モジュールをロードするためのファイルと、モジュールの設定をするためのファイルだ。設定ファイルは、ここで作らなくてもよい。
-/etc/apache2/mods-available/test.load (新規)
 LoadModule test_module /usr/lib/apache2/modules/mod_test.so
-/etc/apache2/mods-available/test.conf (新規)
 <Location /hoge>
 SetHandler test
 </Location>

 ここまで出来たら、Apacheにモジュールを組み込む。
 # a2enmod test
 ここまでの手順は、一度やれば不要となる。ソースを変更した場合は、ここ以降を行えばよい。

 モジュールをインストールし、Apacheを再起動する。
 # apxs2 -c -i mod_test.c
 # /etc/init.d/apache2 restart
 ここまでがすんだら、ブラウザで表示してみる。URLは、http://localhost/hoge となる。"The sample page from mod_test.c"と表示されれば成功。
 モジュールをインストールし、動作確認。
 # make install
 # make test
 "http://localhost/hoge"へアクセスした結果が表示される。~
 "The sample page from mod_test.c"と表示されれば成功。


**コーディング [#r4566793]
 Apacheモジュールには、特殊な仕掛けがある。~
 作成したモジュールはコールバック関数として呼ばれるので、そのための登録が必要となる。~
 設定ファイルを読まないのであれば、テンプレートで作られたソースを元に作成していけばよい。

 Apacheモジュールを作るときに、いくつか注意する点がある。~
-malloc()などのメモリ確保系関数は使用してはいけない~
 代わりに、apr_palloc()を使用する。解放はApacheに任せてよい。
-出力は専用の関数を使用する~
 puts()、printf()、write()の代わりに、ap_rputs()、ap_rprintf()、ap_rwrite()を使用する。

*アクセスカウンタ [#k9c7daf6]
 GIFイメージでアクセスカウンタを出力するモジュールを作成する。~
 アクセスカウンタの場合、Apacheモジュール特有の仕掛けはほとんどない。起動時にのみ呼ばれる関数と、リクエストごとに呼ばれる関数があるので、固定のヘッダは起動時に作成しておくことにする。

 GIF画像で一番ややこしいのは、LZW圧縮((2000年ごろに、UNISYSが特許使用料を取ると言い出したため、一時話題となった。日本では、2004年6月20日に特許の期限が切れたので、現在では自由に使用できる。))の部分だ。日本語の説明がほとんどない。~
 ここでは、カウンタに特化した処理(と、手抜き)のため、使用色数は16色以内で、バインディングタイプはリトルエンディアン専用とした。~
 また、初期化に失敗した場合は、固定のエラー画像を表示するようにした。

&ref(mod_counter.tgz);

*参考 [#v477056b]
http://dsas.blog.klab.org/archives/50574774.html~
http://dsas.blog.klab.org/archives/50578649.html~
http://dsas.blog.klab.org/archives/50596409.html~
http://www.tohoho-web.com/wwwgif.htm~
http://www.winapi-database.com/special/2001_12_2002_1/index.html~
http://www.math.kobe-u.ac.jp/~yamaguti/lzw1.html~

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS