手軽に出来るApacheモジュール開発②
こんにちは、井川です。
前回、Apacheモジュールの手軽な作り方をご紹介しました。Webページに先頭に"hello world"を追加するモジュール(mod_hello_world)は意外と簡単に作成できたことと思います。今回は、モジュール開発を一歩進め、モジュールのOn/Offをディレクトリ毎に設定する方法をご紹介します。
前回(手軽に出来るApacheモジュール開発)と比べていささか複雑にはなりますが、モジュール起動の切り替えを使えるようになると開発の幅が大きく広がります。ぜひ試してみて下さい。
今回の開発の流れは以下の通りです。
① テンプレートの作成
② コード(mod_hello_world.c)の修正・追記
③ コンパイルしてインストール
④ Apacheの設定と再起動
検証環境は次の通りです。
・ CentOS 5.5
・ Apache 2.2.3
① テンプレートの作成
まずは、apxsを使ってひな形を作りましょう。適当なディレクトリに移動して、次のコマンドを実行します。
これでhello_worldディレクトリが作成されました。そのディレクトリへ移動します。
② コードの修正・追記
ソースコード(mod_hello_world.c)を次のように修正・追記します。
このコードでは、Apacheのディレクティブ(HelloWorld)を定義・設定し、その設定をモジュールに渡すことで、ディレクトリ毎にモジュールの挙動を切り替えます。そこで、このコードを次のように大きく2つに分けると理解しやすいと思います。
a)モジュールの設定に関する部分
b)モジュールの機能・登録に関する部分
ここでは"HelloWorld"というディレクティブを定義しています。そして、httpd.confで"HelloWorld"が"On"に設定されているディレクトリやLocationでのみ、mod_hello_worldが有効になります。
③コンパイルとインストール
前回と同様に、コンパイルしてインストールします(rootもしくはsudoで実行)。
④Apacheの設定と再起動
ドキュメントルート以下にtestディレクトリを作成し、httpd.conf(/etc/httpd/conf/httpd.conf)でディレクティブを次のように設定します。
VirtualHostを使っているなら、この設定をVirtualHost内に記述して下さい。最後に、Apacheを再起動します。
これで準備は終わりました。
/testディレクトリにアクセスしてみて下さい。ページの先頭に"hello world"が付いているでしょうか?一方で、testディレクトリ以外の部分にアクセスすると、通常のページがきちんと表示されていれば成功です(先頭に"hello world"がなければOK)。
ディレクトリ毎の設定を行えるようになると、特定のディレクトリへのアクセスに関しては特別な処理を行うことなどが出来るようになります。実用上も必要不可欠な技術ですので、ぜひ実際に試してみて下さい。
前回、Apacheモジュールの手軽な作り方をご紹介しました。Webページに先頭に"hello world"を追加するモジュール(mod_hello_world)は意外と簡単に作成できたことと思います。今回は、モジュール開発を一歩進め、モジュールのOn/Offをディレクトリ毎に設定する方法をご紹介します。
前回(手軽に出来るApacheモジュール開発)と比べていささか複雑にはなりますが、モジュール起動の切り替えを使えるようになると開発の幅が大きく広がります。ぜひ試してみて下さい。
今回の開発の流れは以下の通りです。
① テンプレートの作成
② コード(mod_hello_world.c)の修正・追記
③ コンパイルしてインストール
④ Apacheの設定と再起動
検証環境は次の通りです。
・ CentOS 5.5
・ Apache 2.2.3
① テンプレートの作成
まずは、apxsを使ってひな形を作りましょう。適当なディレクトリに移動して、次のコマンドを実行します。
- >
/usr/sbin/apxs -g -n hello_world - (-g:テンプレート生成、-n:モジュール名指定)
これでhello_worldディレクトリが作成されました。そのディレクトリへ移動します。
② コードの修正・追記
ソースコード(mod_hello_world.c)を次のように修正・追記します。
/** * mod_hello_world.c -- Apache sample hello_world module */ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "ap_config.h" #define DEFAULT_AVAILABLE 0 /** * モジュールの設定に関する部分 */ /* モジュールの設定を表す構造体を定義する */ typedef struct { int is_available; } hello_world_cfg; module AP_MODULE_DECLARE_DATA hello_world_module; /* ディレクトリ設定データを初期化する */ static void *create_dir_config(apr_pool_t *p, char *dir) { hello_world_cfg *conf = (hello_world_cfg *)apr_palloc(p, sizeof(hello_world_cfg)); conf->is_available = DEFAULT_AVAILABLE; return conf; } /* ディレクティブに値を設定する */ static const char *set_available(cmd_parms *cmd, void *cfg, int flag) { hello_world_cfg *conf = (hello_world_cfg *)cfg; conf->is_available = flag; return NULL; } /* ディレクティブを定義する */ static const command_rec hello_world_cmds[] = { AP_INIT_FLAG("HelloWorld", set_available, NULL, OR_ALL, "Use or not"), {NULL} }; /** * モジュールの機能・登録に関する部分 */ /* ハンドラを定義する */ static int hello_world_handler(request_rec *r) { hello_world_cfg *conf = (hello_world_cfg *) ap_get_module_config(r->per_dir_config, &hello_world_module); if (conf->is_available && !r->header_only) { ap_rputs("hello world<br />", r); } return DECLINED; } /* ハンドラを登録する */ static void hello_world_register_hooks(apr_pool_t *p) { ap_hook_handler(hello_world_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* モジュールに登録する */ module AP_MODULE_DECLARE_DATA hello_world_module = { STANDARD20_MODULE_STUFF, create_dir_config, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ hello_world_cmds, /* table of config file commands */ hello_world_register_hooks /* register hooks */ };
このコードでは、Apacheのディレクティブ(HelloWorld)を定義・設定し、その設定をモジュールに渡すことで、ディレクトリ毎にモジュールの挙動を切り替えます。そこで、このコードを次のように大きく2つに分けると理解しやすいと思います。
a)モジュールの設定に関する部分
- ・
モジュールの設定を表す構造体を定義する(16行目) - →
この構造体にモジュールのOn/Offの設定を格納する - ・
ディレクトリ毎に構造体を初期化する関数を定義する(23行目) - →
DEFAULT_AVAILABEが初期値として使われる - ・
ディレクティブを定義する(40行目) - →
HelloWorldディレクティブを定義(httpd.confに記述) - →
AP_INIT_FLAGはOn/Offのみの設定を行うマクロ - ・
ディレクティブを受け取って構造体に設定する関数を定義する(33行目) - →
ディレクトリ毎の設定を読み込む - →
この関数はAP_INIT_FLAGにより登録される
b)モジュールの機能・登録に関する部分
- ・
モジュールの機能を実装したハンドラを修正する(49行目) - →
構造体からモジュールのOn/Offを受け取って挙動を決める - ・
ハンドラを登録する(62行目) - ・
各設定・機能をモジュールに設定する(67行目)
ここでは"HelloWorld"というディレクティブを定義しています。そして、httpd.confで"HelloWorld"が"On"に設定されているディレクトリやLocationでのみ、mod_hello_worldが有効になります。
③コンパイルとインストール
前回と同様に、コンパイルしてインストールします(rootもしくはsudoで実行)。
- [コンパイルとインストールを同時に実行]
- >
/usr/sbin/apxs -i -a -c mod_hello_world.c
④Apacheの設定と再起動
ドキュメントルート以下にtestディレクトリを作成し、httpd.conf(/etc/httpd/conf/httpd.conf)でディレクティブを次のように設定します。
- <Location
"/test"> HelloWorld on - </Location>
VirtualHostを使っているなら、この設定をVirtualHost内に記述して下さい。最後に、Apacheを再起動します。
- /sbin/service
httpd restart
これで準備は終わりました。
/testディレクトリにアクセスしてみて下さい。ページの先頭に"hello world"が付いているでしょうか?一方で、testディレクトリ以外の部分にアクセスすると、通常のページがきちんと表示されていれば成功です(先頭に"hello world"がなければOK)。
ディレクトリ毎の設定を行えるようになると、特定のディレクトリへのアクセスに関しては特別な処理を行うことなどが出来るようになります。実用上も必要不可欠な技術ですので、ぜひ実際に試してみて下さい。
トラックバックURI
最近の記事
システム開発エンジニア募集! [2012年02月03日 : 小林有佳]
OpenVPNで細々便利な設定 [2012年01月31日 : 門脇優児]
【iOS】Viewの開発・デバッグに役立つ色々 [2012年01月23日 : 中川善樹]
PHPDocumentorの利用方法まとめ [2012年01月19日 : 笹亀弘]
Google Chart Toolsを使ってサイトマップを描こう! [2011年12月21日 : 志田仁美]
stumpwm設定v2 [2011年12月19日 : 門脇優児]
Mashup Awards 7の授賞式が行われました [2011年12月16日 : 中川善樹]
社員旅行に行きました [2011年12月12日 : 大橋寛子]
iCloud風のアイコンを作成する(Fireworks) [2011年12月07日 : 和田記光]
iScroll4でネイティブに近いスマホ向けHTMLページを作成する [2011年12月02日 : 松田惇]













コメントフォーム