ふふーん

一緒にやりたくなったのよ!あなたと、調合を!

はじめてのapacheモジュール

apacheのモジュール作ってみたのでメモ。

環境はCentOS 7.3。

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core) 

必要なパッケージを入れる。

# yum install '@development tools' epel-release
# yum install httpd httpd-devel libapreq2 libapreq2-devel

思い出しながら書いてるのでなんか足りないかも。httpd-develに入ってるapxsというコマンドがいろいろ便利にやってくれる。

まず、"hello"を返すだけのやつ。apxs -gでテンプレート作ってくれるので、ほぼそのまま使える。

# apxs -g -n hello
Creating [DIR]  hello
Creating [FILE] hello/Makefile
Creating [FILE] hello/modules.mk
Creating [FILE] hello/mod_hello.c
Creating [FILE] hello/.deps
# ls hello/
Makefile  mod_hello.c  modules.mk

ここで作られるmod_hello.cの先頭に便利コメントがあるので読んでおくとよさげ。

hello_handler()だけちょっと直せば(putsのメッセージしか変えてないけども)おわり。

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("hello\n", r);
    return OK;
}

モジュールのビルドとhttpdのリロード。リロードする前にhttpdの設定ファイルを追加する。モジュールのビルドとインストールまではapxsコマンドがやってくれる便利。

# apxs -c -i mod_hello.c
# cat /etc/httpd/conf.d/hello.conf
LoadModule hello_module modules/mod_hello.so
<Location /hello>
    SetHandler hello
</Location>
# systemctl reload httpd

動いてるか確認する。

# curl http://127.0.0.1/hello
hello

大丈夫そう。

次、POSTで受け取ったデータをそのまま返すやつ。echoサーバー的な。

テンプレート作るのとかはほぼ同じコマンドでできる。ビルドするときにインクルードパスを追加するところだけ注意。

# apxs -g -n echo

ハンドラーを作る。

static int echo_handler(request_rec *r)
{
    if (strcmp(r->handler, "echo")) {
        return DECLINED;
    }
    r->content_type = "text/html";

    if (!r->header_only)
        return DECLINED;

    apreq_handle_t *apreq = apreq_handle_apache2(r);
    const apr_table_t *param;
    apreq_body(apreq, &param);

    ap_rprintf(r, "%s\n", apreq_params_as_string(r->pool, param, NULL, APREQ_JOIN_AS_IS));

    return OK;

ビルドとインストール。

# apxs -I /usr/include/apreq2 -c -i mod_echo.c

httpdの設定ファイル追加して、リロードしたら、動作確認。

# curl -d 'text=hellohello' http://127.0.0.1/echo
"hellohello"

おわり。