はじめに

前回の記事:Apacheのmod_proxyのコードを読んでみる(1)

前回はApacheの処理の全体像についての記事を書きました。

今回はmod_proxy.cのファイルで、mod_proxyの概要を把握するために後半に実装されているhook定義関数周辺の理解内容を記事にします。

前回同様に我流で読み進めているので、理解内容に間違いなどありましたらご指摘ください。

mod_proxyの概要把握

APR_HOOK_STRUCT

mod_proxy.cのファイルで最後に実装されているmod_proxy独自のhook定義関数です。

APR_HOOK_STRUCTとその後に続くAPR_IMPLEMENT_EXTERNAL_HOOK_XXXのマクロが展開されて、mod_proxy_wstunnelなどのmod_proxyの後段モジュールでproxy_XXX関数(たとえばproxy_schme_handler)として実装されます。

APR_HOOK_STRUCT(
    APR_HOOK_LINK(scheme_handler)
    APR_HOOK_LINK(canon_handler)
    APR_HOOK_LINK(pre_request)
    APR_HOOK_LINK(post_request)
    APR_HOOK_LINK(request_status)
)

AP_DECLARE_MODULE(proxy)

APR_HOOK_STRUCTの直前で定義されており、apache標準のhook定義関数です。apache のmoduleは必須で実装する必要があります。

proxy_cmds、register_hooksは後述しますが、他の実装内容はコメントに書いてある通りなので説明を省略します。

AP_DECLARE_MODULE(proxy) =
{
    STANDARD20_MODULE_STUFF,
    create_proxy_dir_config,    /* create per-directory config structure */
    merge_proxy_dir_config,     /* merge per-directory config structures */
    create_proxy_config,        /* create per-server config structure */
    merge_proxy_config,         /* merge per-server config structures */
    proxy_cmds,                 /* command table */
    register_hooks
};

proxy_cmds[]

confファイルで指定できるディレクティブの定義情報の配列です。
AP_DECLARE_MODULEの末尾から2番目に指定されている配列です。

mod_proxyだけでなく、mod_proxy_balancerなどのmod_proxyの後段で使用するディレクティブもここで登録されています。

static const command_rec proxy_cmds[] =
{
    AP_INIT_RAW_ARGS("<Proxy", proxysection, NULL, RSRC_CONF,
    "Container for directives affecting resources located in the proxied "
    "location"),
    //
    // 中略
    //
    AP_INIT_FLAG("ProxyAddHeaders", add_proxy_http_headers, NULL, RSRC_CONF|ACCESS_CONF,
     "on if X-Forwarded-* headers should be added or completed"),
    {NULL}
};

  • 第1引数:ディレクティブ定義文字列
  • 第2引数:ディレクティブ登録関数の定義

という定義内容になっています。
ディレクティブ登録関数(proxysectionなど)は、基本的にconfファイルで読み取った内容を文字列処理するという実装で、読めば分かると思うので説明を省略します。

register_hooks

hook登録関数で、AP_DECLARE_MODULEの最後に指定されている関数です。

hook登録関数では、handler登録関数であるap_hook_handlerのみのmoduleも多いですが、mod_proxyの場合は多くのhookが登録しています。

それぞれのhook関数のフェーズで処理している内容は、前回の記事の参考記事(フックから全体像を追う)で記載されているので説明を省略します。

handler登録関数(ap_hook_XXX)の定義に関しては参考情報を参照ください。

static void register_hooks(apr_pool_t *p)
{
    /* fixup before mod_rewrite, so that the proxied url will not
     * escaped accidentally by our fixup.
     */
    static const char * const aszSucc[] = { "mod_rewrite.c", NULL};
    /* Only the mpm_winnt has child init hook handler.
     * make sure that we are called after the mpm
     * initializes.
     */
    static const char *const aszPred[] = { "mpm_winnt.c", "mod_proxy_balancer.c",
                                           "mod_proxy_hcheck.c", NULL};
    /* handler */
    ap_hook_handler(proxy_handler, NULL, NULL, APR_HOOK_FIRST);
    /* filename-to-URI translation */
    ap_hook_translate_name(proxy_trans, aszSucc, NULL, APR_HOOK_FIRST);
    /* walk <Proxy > entries and suppress default TRACE behavior */
    ap_hook_map_to_storage(proxy_map_location, NULL,NULL, APR_HOOK_FIRST);
    /* fixups */
    ap_hook_fixups(proxy_fixup, NULL, aszSucc, APR_HOOK_FIRST);
    /* post read_request handling */
    ap_hook_post_read_request(proxy_detect, NULL, NULL, APR_HOOK_FIRST);
    /* pre config handling */
    ap_hook_pre_config(proxy_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
    /* post config handling */
    ap_hook_post_config(proxy_post_config, NULL, NULL, APR_HOOK_MIDDLE);
    /* child init handling */
    ap_hook_child_init(child_init, aszPred, NULL, APR_HOOK_MIDDLE);

    /* register optional functions within proxy_util.c */
    proxy_util_register_hooks(p);
}

参考情報

次回の予定

今回はmod_proxyの実装の概要について説明したので、次回はmod_proxyの実装の詳細として、各handler関数(hook関数の第一引数)の理解内容に入っていこうと思っています。

次回:Apacheのmod_proxyのコードを読んでみる(3)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.