モジュール版HelloWorld

Apacheのモジュールを作るときのおぼえがき。
とはいえ、生成されたmod_hello.cのコメント部分をみればわかることだけど…。

テンプレート生成

apxsコマンドでテンプレートを生成する
-g : テンプレート生成
-n 名前 : モジュール名指定

$ apxs -g -n hello

カレントディレクトリに hello という名前のディレクトリができる。
中身はmod_hello.c Makefile modules.mk .dep

ソースコード

出来たmod_hello.cを以下のように修正

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"

static int hello_handler(request_rec *r){
    if(strcmp(r->handler, "hello")) return DECLINED;
    r->content_type = "text/html";      
    if(!r->header_only) ap_rputs("<h1>Hello World!</h1>", r);
    return OK;
}

static void hello_register_hooks(apr_pool_t *p){
    ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA hello_module = {STANDARD20_MODULE_STUFF, NULL,NULL,NULL,NULL,NULL,hello_register_hooks};

コンパイル

apxsコマンドでコンパイル(makeはうまく動かなかった)
-cに加えて必要に応じて-iや-aを追加する。
-c : コンパイル
-i : mod_hello.soをmolulesディレクトリにコピー
-a : httpd.confにLoadModule行を追加

$ apxs -c -i -a mod_hello.c 

httpd.confの設定

apxsコマンドの-iをしていない場合は以下を追加。
(なお、-iを使った場合もファイル末尾ではなくて、それなりの場所に挿入してくれていた)

LoadModule hello_module        libexec/apache2/mod_hello.so

/etc/apache2/other/hello.confを作成し、テスト実行位置を指定
(httpd.confでInclude /etc/apache2/other/*.confとしている前提)

<Location "/test/">
  SetHandler hello
</Location>

テスト実行

ブラウザから、http://localhost/test/ をアクセス