« 2008年02月 | メイン | 2008年06月 »
2008年03月28日
Apache API モジュールを作ろう
char *src = malloc(strlen(r->uri));
strcpy(src , r->uri);
char *src = ap_pcalloc(r->pool, strlen(r->uri) );
src = ap_pstrdup(r->pool, r->uri);
上と下のコードでは、結果が違う場合があります。
直接システムコールやライブラリ関数呼び出すことは避けましょう。
基本的な関数はApacheAPIとして用意してあるようです。
ほとんどが英語のドキュメントなので、サンプルを見ながら黙々と作業です。
低負荷な状況では問題がおこらなくても、高負荷になり連続してメモリの確保・開放などを繰り返すと問題が発生すると思うよ。
ってな事に気をつけて、具体的にモジュールを作成していきます。
今回作るのは、Apache1.3でのキャッシュモジュールです。
わけあってApache2に移行出来ずにいるWEBサービスで、画像ファイルのみをキャッシュさせる必要が出てきました。
画像ファイルは一つのDISKに入っていて、WEBサーバ約20台が表に立っています。
画像へのアクセスはすべてここにアクセスが来るため、これ以上WEBサーバーを増やしてもここがボトルネックになり、スピードが上がらない状況になりつつあります。
解決方法はほかにも色々とありそうですが、Apacheのモジュールを作ってみたいので、他の仕組みは考えません。(お金をかけたくないし、サーバーもできればこれ以上増やしたくないし、プログラムの作り替えといったリスキーな手法は避けたい、とか理由もありますよ!)
ってな事で、とにかく作成に取り掛かります。・・・・・・・
2008年03月22日
Apacheのモジュール作成 API Module
Apache1.3でモジュールの作成に挑戦してみます。
かゆいところに手が届く物は、やっぱり自分で作らなくちゃね!!
と言うことで、NDSで鍛えた英語力でApacheAPIの英語DocumentをGET&なんとなく読む
http://httpd.apache.org/dev/apidoc/
http://httpd.apache.org/docs/2.0/developer/modules.html
http://gnug.nu/index.php?option=com_content&task=view&id=25&Itemid=5
サンプルを物色する。
Apache1.3は下記の場所(Apacheの状態)でフック(処理の横取り)することができる。
module cgi_module = {
STANDARD_MODULE_STUFF,
NULL, /* initializer */
NULL, /* dir config creator */
NULL, /* dir merger --- default is to override */
make_cgi_server_config, /* server config */
merge_cgi_server_config, /* merge server config */
cgi_cmds, /* command table */
cgi_handlers, /* handlers */
translate_scriptalias, /* filename translation */
NULL, /* check_user_id */
NULL, /* check auth */
NULL, /* check access */
type_scriptalias, /* type_checker */
NULL, /* fixups */
NULL, /* logger */
NULL /* header parser */
};
全ての場所で、
FILE *stream2;
stream2 = fopen(LOG_FILE, "ab+");
fwrite("child_exit\n", strlen((char *)"child_exit\n"), 1, stream2);
fclose(stream2);
こんな感じでLOGを吐き出すようにして、Apacheを一通り動かしてみると早く理解できます。
続く・・・・