Apache2の自作モジュールからで httpd.conf から値をとる

Apacheの設定は httpd.conf で行いますが独自のモジュールを作成した場合に、独自のディレクティブを定義し設定を読み込みたい場合があります。
モジュール固有のパラメータなどがサーバー毎に異なる場合などに利用できるでしょう。


Apache1.3系での方法は、Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)を読めばばっちり分かるのですが Apache2系に関しては情報が少ないのでまとめておきます。
なお今回はディレクトリ毎の設定ではなく、サーバー毎の設定である per-server-config を例にしていますので per-dir-config の場合は適宜読み替えてください。


やることは以下5つ

  1. 設定情報を保持する構造体を定義する
  2. configを作成する関数を用意する
  3. 各ディレクティブを取得して構造体にセットするための関数を用意する
  4. command_rec構造体に各ディレクティブの定義とセットするための関数等々をセットする
  5. module構造体にcommand_rec構造体、config作成関数をセットする

設定情報を保持する構造体を定義する

typedef struct {
    char* hoge;
    char* huga;
} modulename_server_config;

こんな感じで設定情報を保持する構造体を定義します。もちろん char* だけでなく int なども使えます。

configを作成する関数を用意する

static void* create_modulename_server_config(apr_pool_t* p, server_rec* s)
{
    modulename_server_config* conf = apr_palloc(p, sizeof(modulename_sever__config));
    conf->hoge = apr_pstrdup(p, "hogehoge"); // デフォルト値を入れておくとか
    return conf;
}

ディレクトリを取得して構造体にセットするための関数を用意する

static const char* modulename_set_hoge(cmd_parms* cmd, void* dummy, const char* arg)
{
    modulename_server_config* conf = ap_get_module_config(cmd->server->module_config, &modulename_module);
    conf->hoge = apr_pstrdup(cmd->pool, arg);
    return NULL;
}

ここで実際に hoge ディレクティブの値を構造体にセットします。
エラーチェックや数値への変換などはここで行います。

command_rec構造体に各ディレクティブの定義とセットするための関数等々をセットする

static const command_rec modulename_cmds[] = {
    AP_INIT_TAKE1("hoge", modulename_set_hoge, NULL, OR_ALL,
                  "help message for hoge"),
   {NULL}
};

ディレクティブ名・値をセットするための関数・httpd.confのどこのスコープ内で有効なものか?などをセットします。
AP_INIT_TAKE1 はディレクティブが引数をひとつとるということを意味します。
AP_INIT_TAKE1の第一引数の hoge がディレクティブ名になります。


つまり
httpd.confで

hoge somevalue

と書くことになります。

module構造体にcommand_rec構造体、config作成関数をセットする

module AP_MODULE_DECLARE_DATA modulename_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                            /* create per-dir    config structures */
    NULL,                            /* merge  per-dir    config structures */
    create_modulename_server_config, /* create per-server config structures */
    NULL,                            /* merge  per-server config structures */
    modulename_cmd,                  /* table of config file commands       */
    modulename_register_hooks        /* register hooks                      */
};


ここが起点です。module構造体にcommand_rec構造体、config作成関数をセットします。
というわけで大分端折りましたがこんな感じで取れると思います。


細かいパラメータ等は

Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)

Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)

を読んでいただければ分かると思います。