Apacheモジュールを作る このエントリーをはてなブックマークに追加

提供:Asterisk Works Wiki
移動: 案内, 検索

目次

開発環境の整備

Linux環境でソースからApacheをインストールしたなら、必要な環境はほぼ揃っている。

パッケージでApacheをインストールしたなら、apxsが使える必要がある。

ubuntuなら次のパッケージをインストールする

> sodo apt-get install apache2-threaded-dev

すると、apxs2というコマンドが使えるようになる。

雛形作成からコンパイル、インストールまで

モジュールの雛形を作成するには次のコマンドを実行する

> apxs -g -n mymodule

すると mymodule ディレクトリが作成され、次の3ファイルが生成される。

  • Makefile
  • mod_mymodule.c
  • modules.mk

このmod_mymodule.cに実装していく。

コンパイル&インストール

mymoduleディレクトリで次のコマンドを実行するとコンパイルされ、APACHE_HOME/modulesにmod_mymodule.soがコピーされる

> make 
> sudo make all install

実際にモジュールを使うには次のモジュール呼び出しをhttpd.confに追加する

LoadModule mymodule_module        modules/mod_mymodule.so

次のコマンドだと、httpd.confへのLoadModule追加までやってくれる

> sudo apxs -c -i -a mod_mymodule.c

ハンドラー

Apacheのモジュールを実装するとは、ハンドラーを実装することと言っても良い。

request_rec構造体

include/httpd.h で定義されている構造体。HTTPリクエストの情報を格納する。

ハンドラーの引数として渡される。

ハンドラー内でリクエスト/レスポンス情報を操作するのに使う。

メンバー名 説明
handler 処理するハンドラの名称
content_type Content-Typeヘッダ取得
header_only HEADリクエストかどうか
pool リクエスト毎のメモリプール
args QUERY_STRING値
method_number リクエストメソッドの数値表現?
headers_in リクエストヘッダ apr_table_t型
headers_out レスポンスヘッダ apr_table_t型
uri URI
filename DISK上のファイル名

ハンドラー関数の戻り値

ハンドラーの戻り値として返せる値はマクロがhttpd.hに定義されている。

戻り値として定義されている定数 意味
OK 処理成功
DECLINED 次のモジュールに処理を任せる
HTTP_NOT_FOUND
HTTP_FORBIDDEN
HTTP_INTERNAL_SERVER_ERROR



ディレクティブ

ディレクティブを作るには

これらのマクロはhttp_config.hに定義されている。

AP_INIT_TAKE1
パラメータが一つのディレクティブを定義
AP_INIT_TAKE2
パラメータが2つのディレクティブを定義

便利なユーティリティ

文字列の操作

文字列のコピー
char *str = apr_pstrdup(p, src);
文字列の連結
char *str = apr_pstrcat(p, str1, str2, NULL);
文字列のフォーマット
char *str = apr_psprintf(p, “%d\n”, n);

動的配列

配列生成
apr_array_header_t *arr = apr_array_make(p, 10, sizeof(char *));
要素の追加
*(const char **)apr_array_push(arr) = val;
要素数の取得
arr->nelts;
配列実態
char **elts = arr->elts;

テーブル

テーブル生成
apr_table_t *tbl= apr_table_make(p, 12);
値のセット
apr_table_set(tbl, key, val);
値の取得
char *val = apr_table_get(tbl, key);
値の削除
apr_table_unset(tbl, key);

ファイル:Example.jpg

Apache API

コンテンツの出力

ap_rputs(const char *str, requst_rec *r)
ap_rwrite(const void *buf, int nbytes, requst_rec *r)
ap_rprintf(request_rec *r, const char *fmt, …);

デバッグ

Apacheモジュールのデバッグ

個人用ツール
名前空間
変種
操作
案内
主なカテゴリ
ツールボックス