SlideShare una empresa de Scribd logo
1 de 32
Apache モジュール入門 ( 株 ) ライブドア 池邉智洋
Apache モジュールとは? ,[object Object],[object Object],[object Object]
Apache の構造 Apache Core Apache API Apache モジュール
Apache モジュールの利点、欠点 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用箇所 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Apache のライフサイクル ,[object Object],[object Object],クライアントの接続 リクエスト読み込み URI 変換 アクセス制御 認証 微調整 (fixup) コンテンツ出力 ロギング インプットフィルタ アウトプットフィルタ
APR ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
メモリ管理 ,[object Object],[object Object],[object Object],my_module_conf *conf =  apr_palloc(p,sizeof(my_module_conf)); 領域の確保
文字列操作 ,[object Object],[object Object],char *str = apr_pstrdup(p, src); 文字列のコピー char *str = apr_pstrcat(p, str1, str2, NULL); 文字列の連結 char *str = apr_psprintf(p, “%d”, n); 文字列フォーマット
動的配列 ,[object Object],[object Object],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; 配列実体
テーブル ,[object Object],[object Object],[object Object],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); 値の削除
apxs ,[object Object],[object Object],% apxs –g –n <module_name> 雛形の作成 # apxs –i –a -c mod_<module_name>.c コンパイルしてインストール
雛形の作成 % 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 # cd hello/ # apxs –i –a –c mod_hello.c # /usr/local/apache2/bin/apachectl stop # /usr/local/apache2/bin/apachectl start <Location /hello> SetHandler hello </Location> httpd.conf
確認
ソースコード 1 #include &quot;httpd.h&quot; #include &quot;http_config.h&quot; #include &quot;http_protocol.h&quot; #include &quot;ap_config.h&quot; /*  コンテントハンドラ  */ static int hello_handler(request_rec *r) { if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;;  if (!r->header_only) ap_rputs(&quot;The sample page from mod_hello.c&quot;, r); return OK; }
request_rec  構造体 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
request_rec  構造体 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Apache API ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ハンドラの返り値 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールの連鎖 ,[object Object],[object Object],mod_foo foo_handler() mod_bar bar_handler() default default_handler()
ソースコード 2 static void hello_register_hooks(apr_pool_t *p) { ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF,  NULL,  /* create per-dir  config */ NULL,  /* merge  per-dir  config */ NULL,  /* create per-server config */ NULL,  /* merge  per-server config */ NULL,  /* config file commands */ hello_register_hooks  /* register hooks */ };
ハンドラの登録 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールの定義 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
設定値の使用 ,[object Object],<Location /hello> SetHandler hello HelloMessage “Hello livedoor!” </Location> httpd.conf
設定値を格納する構造体 typedef struct { char *msg; } hello_cfg; 構造体の宣言 static void *create_hello_cfg(apr_pool_t *p, char *dir) { hello_cfg *cfg =  apr_palloc(p, sizeof(hello_cfg)); cfg->msg = &quot;Hello World!&quot;; return (void *)cfg; } 初期化
ディレクティブの定義 static const char *cmd_set_message(cmd_parms *cmd, void *c, const char *v) { hello_cfg *cfg = (hello_cfg *)c; cfg->msg = apr_pstrdup(cmd->pool, v); return NULL; } static const command_rec hello_cmds[] = { AP_INIT_TAKE1(&quot;HelloMessage&quot;,  cmd_set_message,  NULL, ACCESS_CONF,  &quot;Set mod_hello message.&quot;), {NULL} }; HelloMessage  ディレクティブを定義
ディレクティブ名の登録 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ディレクティブの設定場所 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
モジュールに登録 module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF,  hello_create_cfg,  NULL,  NULL,  NULL,  hello_cmds,  hello_register_hooks  }; モジュール定義を変更
設定値の利用 static int hello_handler(request_rec *r) { hello_cfg *cfg =  ap_get_module_config(r->per_dir_config, &hello_module); if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;;  if (!r->header_only) ap_rprintf(r, &quot;%s&quot;, cfg->msg); return OK; } ap_get_module_config  で設定値を参照
さらに複雑なモジュールを書くために ,[object Object],[object Object],[object Object],[object Object]
おしまい

Más contenido relacionado

La actualidad más candente

ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきかElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきかAmazon Web Services Japan
 
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化Micrometerでメトリクスを収集してAmazon CloudWatchで可視化
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化Ryosuke Uchitate
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐Terry Cho
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBrendan Gregg
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!NGINX, Inc.
 
BSidesDelhi 2018: Finding Memory Bugs with the Address Sanitizer
BSidesDelhi 2018: Finding Memory Bugs with the Address SanitizerBSidesDelhi 2018: Finding Memory Bugs with the Address Sanitizer
BSidesDelhi 2018: Finding Memory Bugs with the Address SanitizerBSides Delhi
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기Jongwon Kim
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いRetrieva inc.
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015Toru Yamaguchi
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceToshiaki Maki
 
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月VirtualTech Japan Inc.
 
Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Adrian Huang
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
LaravelとテストについてTakeo Noda
 
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~Hiroshi Tokumaru
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
TIME_WAITに関する話
TIME_WAITに関する話TIME_WAITに関する話
TIME_WAITに関する話Takanori Sejima
 
Rclex: A Library for Robotics meet Elixir
Rclex: A Library for Robotics meet ElixirRclex: A Library for Robotics meet Elixir
Rclex: A Library for Robotics meet ElixirHideki Takase
 
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介VirtualTech Japan Inc.
 

La actualidad más candente (20)

ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきかElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
 
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化Micrometerでメトリクスを収集してAmazon CloudWatchで可視化
Micrometerでメトリクスを収集してAmazon CloudWatchで可視化
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
NGINXセミナー(基本編)~いまさら聞けないNGINXコンフィグなど基本がわかる!
 
RESTfulとは
RESTfulとはRESTfulとは
RESTfulとは
 
BSidesDelhi 2018: Finding Memory Bugs with the Address Sanitizer
BSidesDelhi 2018: Finding Memory Bugs with the Address SanitizerBSidesDelhi 2018: Finding Memory Bugs with the Address Sanitizer
BSidesDelhi 2018: Finding Memory Bugs with the Address Sanitizer
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
 
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherence
 
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
OpenStack検証環境構築・トラブルシューティング入門 - OpenStack最新情報セミナー 2014年8月
 
Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)
 
Laravelとテストについて
LaravelとテストについてLaravelとテストについて
Laravelとテストについて
 
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
ここが変だよ、グローバルスタンダードの脆弱性対策~入力値の考え方~
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
TIME_WAITに関する話
TIME_WAITに関する話TIME_WAITに関する話
TIME_WAITに関する話
 
Rclex: A Library for Robotics meet Elixir
Rclex: A Library for Robotics meet ElixirRclex: A Library for Robotics meet Elixir
Rclex: A Library for Robotics meet Elixir
 
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介OpenStackを使用したGPU仮想化IaaS環境 事例紹介
OpenStackを使用したGPU仮想化IaaS環境 事例紹介
 

Similar a Apache Module

ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osakaNaotaka Jay HOTTA
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)Akio Katayama
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-publicAmazon Web Services Japan
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Taku Unno
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Kikunaga Taishi
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門Hiroaki Murayama
 
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方Yosuke Furukawa
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
Railsの運用について
Railsの運用についてRailsの運用について
Railsの運用についてYuuki Namikawa
 
Ansibleで始めるinfraTDD(初級編)
Ansibleで始めるinfraTDD(初級編)Ansibleで始めるinfraTDD(初級編)
Ansibleで始めるinfraTDD(初級編)佐久本正太
 

Similar a Apache Module (20)

ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
ASP.NET MVC 1.0
ASP.NET MVC 1.0ASP.NET MVC 1.0
ASP.NET MVC 1.0
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
hbstudy37 doc
hbstudy37 dochbstudy37 doc
hbstudy37 doc
 
densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
 
Windows Azure PHP Tips
Windows Azure PHP Tips Windows Azure PHP Tips
Windows Azure PHP Tips
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4
 
1MB
1MB1MB
1MB
 
BBBBB
BBBBBBBBBB
BBBBB
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
 
WebAPIではじめるphp入門
WebAPIではじめるphp入門WebAPIではじめるphp入門
WebAPIではじめるphp入門
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
Railsの運用について
Railsの運用についてRailsの運用について
Railsの運用について
 
Ansibleで始めるinfraTDD(初級編)
Ansibleで始めるinfraTDD(初級編)Ansibleで始めるinfraTDD(初級編)
Ansibleで始めるinfraTDD(初級編)
 

Apache Module

  • 1. Apache モジュール入門 ( 株 ) ライブドア 池邉智洋
  • 2.
  • 3. Apache の構造 Apache Core Apache API Apache モジュール
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13. 雛形の作成 % 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 # cd hello/ # apxs –i –a –c mod_hello.c # /usr/local/apache2/bin/apachectl stop # /usr/local/apache2/bin/apachectl start <Location /hello> SetHandler hello </Location> httpd.conf
  • 15. ソースコード 1 #include &quot;httpd.h&quot; #include &quot;http_config.h&quot; #include &quot;http_protocol.h&quot; #include &quot;ap_config.h&quot; /* コンテントハンドラ */ static int hello_handler(request_rec *r) { if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;; if (!r->header_only) ap_rputs(&quot;The sample page from mod_hello.c&quot;, r); return OK; }
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. ソースコード 2 static void hello_register_hooks(apr_pool_t *p) { ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-dir config */ NULL, /* merge per-dir config */ NULL, /* create per-server config */ NULL, /* merge per-server config */ NULL, /* config file commands */ hello_register_hooks /* register hooks */ };
  • 22.
  • 23.
  • 24.
  • 25. 設定値を格納する構造体 typedef struct { char *msg; } hello_cfg; 構造体の宣言 static void *create_hello_cfg(apr_pool_t *p, char *dir) { hello_cfg *cfg = apr_palloc(p, sizeof(hello_cfg)); cfg->msg = &quot;Hello World!&quot;; return (void *)cfg; } 初期化
  • 26. ディレクティブの定義 static const char *cmd_set_message(cmd_parms *cmd, void *c, const char *v) { hello_cfg *cfg = (hello_cfg *)c; cfg->msg = apr_pstrdup(cmd->pool, v); return NULL; } static const command_rec hello_cmds[] = { AP_INIT_TAKE1(&quot;HelloMessage&quot;, cmd_set_message, NULL, ACCESS_CONF, &quot;Set mod_hello message.&quot;), {NULL} }; HelloMessage ディレクティブを定義
  • 27.
  • 28.
  • 29. モジュールに登録 module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF, hello_create_cfg, NULL, NULL, NULL, hello_cmds, hello_register_hooks }; モジュール定義を変更
  • 30. 設定値の利用 static int hello_handler(request_rec *r) { hello_cfg *cfg = ap_get_module_config(r->per_dir_config, &hello_module); if (strcmp(r->handler, &quot;hello&quot;)) { return DECLINED; } r->content_type = &quot;text/html&quot;; if (!r->header_only) ap_rprintf(r, &quot;%s&quot;, cfg->msg); return OK; } ap_get_module_config で設定値を参照
  • 31.