Symfoware

Symfowareについての考察blog

nginx 拡張モジュール 設定ファイルの値を取得する

nginxの拡張モジュールを作ってみています。
nginx 拡張モジュールの作り方

設定ファイルに記載されているパラメーターを取得する方法を調べてみました。

こちらを参考にしています。
Emiller's Guide To Nginx Module Development


仕様



キーが「sample」で値が「on,off」の二種類。
キーが「sample_num」で値が数値。
キーが「sample_access_key」で値が文字列。

この三種類のパラメーターを受け取ります。



値の保存先と読み取りの定義



設定値の保存は、独自の定義体を用意し、そこに設定します。


  1. // nginx.confの設定値取得用
  2. typedef struct {
  3.     ngx_flag_t enable; // on,offフラグ
  4.     ngx_uint_t num; // sample_numの値
  5.     ngx_str_t key; // sample_access_keyの値
  6. } ngx_http_sample_loc_conf_t;





値を読み取るための定義部分はこんな感じ。


  1. // confファイルの記載内容読み取り指定
  2. static ngx_command_t ngx_http_sample_commands[] = {
  3.     // on,off制御
  4.     { ngx_string("sample"), // キーの名称
  5.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, // どのconfを読むか
  6.      ngx_conf_set_flag_slot, // on,off 0,1の読み取り
  7.      NGX_HTTP_LOC_CONF_OFFSET,
  8.      offsetof(ngx_http_sample_loc_conf_t, enable), // ngx_http_sample_loc_conf_t->enableに設定
  9.      NULL },
  10.     
  11.     // 数値パラメーター「sample_num」
  12.     { ngx_string("sample_num"), // キーの名称
  13.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, // NGX_CONF_TAKE1で1つの値
  14.      ngx_conf_set_num_slot, // 数値の読み取り
  15.      NGX_HTTP_LOC_CONF_OFFSET,
  16.      offsetof(ngx_http_sample_loc_conf_t, num), // ngx_http_sample_loc_conf_t->numに設定
  17.      NULL },
  18.     
  19.     // 文字列パラメーター「sample_access_key」
  20.     { ngx_string("sample_access_key"), // キーの名称
  21.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, // NGX_CONF_TAKE1で1つの値
  22.      ngx_conf_set_str_slot, // 文字列の読み取り
  23.      NGX_HTTP_LOC_CONF_OFFSET,
  24.      offsetof(ngx_http_sample_loc_conf_t, key), // ngx_http_sample_loc_conf_t->keyに設定
  25.      NULL },
  26.     
  27.      ngx_null_command
  28. };




NGX_CONF_FLAG:on,offの値を取得
NGX_CONF_TAKE1:1つの引数を持つパラメーターを取得
という指定になります。

読み取り方法は、
フラグ:ngx_conf_set_flag_slot
数値:ngx_conf_set_num_slot
文字列:ngx_conf_set_str_slot

を指定。


初期化やマージはこんな感じ。


  1. // conf読み取り初期化
  2. static void *
  3. ngx_http_sample_create_loc_conf(ngx_conf_t *cf)
  4. {
  5.     ngx_http_sample_loc_conf_t *conf;
  6.     conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sample_loc_conf_t));
  7.     if (conf == NULL) {
  8.         return NGX_CONF_ERROR;
  9.     }
  10.     
  11.     // 初期値はoff
  12.     conf->enable = NGX_CONF_UNSET;
  13.     conf->num = NGX_CONF_UNSET;
  14.     return conf;
  15. }
  16. // 読み取ったconfの値をマージする
  17. static char *
  18. ngx_http_sample_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
  19. {
  20.     ngx_http_sample_loc_conf_t *prev = parent;
  21.     ngx_http_sample_loc_conf_t *conf = child;
  22.     
  23.     ngx_conf_merge_value(conf->enable, prev->enable, 0);
  24.     ngx_conf_merge_uint_value(conf->num, prev->num, 10);
  25.     ngx_conf_merge_str_value(conf->key, prev->key, "key");
  26.     
  27.     return NGX_CONF_OK;
  28. }






ソースの全体像は以下のようになりました。


  1. #include <ngx_config.h>
  2. #include <ngx_core.h>
  3. #include <ngx_http.h>
  4. // nginx.confの設定値取得用
  5. typedef struct {
  6.     ngx_flag_t enable; // on,offフラグ
  7.     ngx_uint_t num; // sample_numの値
  8.     ngx_str_t key; // sample_access_keyの値
  9. } ngx_http_sample_loc_conf_t;
  10. static ngx_int_t ngx_http_sample_handler(ngx_http_request_t *r);
  11. static void *ngx_http_sample_create_loc_conf(ngx_conf_t *cf);
  12. static char *ngx_http_sample_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);
  13. static ngx_int_t ngx_http_sample_init(ngx_conf_t *cf);
  14. // confファイルの記載内容読み取り指定
  15. static ngx_command_t ngx_http_sample_commands[] = {
  16.     // on,off制御
  17.     { ngx_string("sample"), // キーの名称
  18.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, // どのconfを読むか
  19.      ngx_conf_set_flag_slot, // on,off 0,1の読み取り
  20.      NGX_HTTP_LOC_CONF_OFFSET,
  21.      offsetof(ngx_http_sample_loc_conf_t, enable), // ngx_http_sample_loc_conf_t->enableに設定
  22.      NULL },
  23.     
  24.     // 数値パラメーター「sample_num」
  25.     { ngx_string("sample_num"), // キーの名称
  26.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, // NGX_CONF_TAKE1で1つの値
  27.      ngx_conf_set_num_slot, // 数値の読み取り
  28.      NGX_HTTP_LOC_CONF_OFFSET,
  29.      offsetof(ngx_http_sample_loc_conf_t, num), // ngx_http_sample_loc_conf_t->numに設定
  30.      NULL },
  31.     
  32.     // 文字列パラメーター「sample_access_key」
  33.     { ngx_string("sample_access_key"), // キーの名称
  34.      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, // NGX_CONF_TAKE1で1つの値
  35.      ngx_conf_set_str_slot, // 文字列の読み取り
  36.      NGX_HTTP_LOC_CONF_OFFSET,
  37.      offsetof(ngx_http_sample_loc_conf_t, key), // ngx_http_sample_loc_conf_t->keyに設定
  38.      NULL },
  39.     
  40.      ngx_null_command
  41. };
  42. static ngx_http_module_t ngx_http_sample_module_ctx = {
  43.     NULL, /* preconfiguration */
  44.     ngx_http_sample_init, /* postconfiguration */
  45.     NULL, /* create main configuration */
  46.     NULL, /* init main configuration */
  47.     NULL, /* create server configuration */
  48.     NULL, /* merge server configuration */
  49.     ngx_http_sample_create_loc_conf, /* create location configuration */
  50.     ngx_http_sample_merge_loc_conf /* merge location configuration */
  51. };
  52. ngx_module_t ngx_http_sample_module = {
  53.     NGX_MODULE_V1,
  54.     &ngx_http_sample_module_ctx, /* module context */
  55.     ngx_http_sample_commands, /* module directives */
  56.     NGX_HTTP_MODULE,             /* module type */
  57.     NULL,                         /* init master */
  58.     NULL,                         /* init module */
  59.     NULL,                         /* init process */
  60.     NULL,                         /* init thread */
  61.     NULL,                         /* exit thread */
  62.     NULL,                         /* exit process */
  63.     NULL,                         /* exit master */
  64.     NGX_MODULE_V1_PADDING
  65. };
  66. // conf読み取り初期化
  67. static void *
  68. ngx_http_sample_create_loc_conf(ngx_conf_t *cf)
  69. {
  70.     ngx_http_sample_loc_conf_t *conf;
  71.     conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sample_loc_conf_t));
  72.     if (conf == NULL) {
  73.         return NGX_CONF_ERROR;
  74.     }
  75.     
  76.     // 初期値はoff
  77.     conf->enable = NGX_CONF_UNSET;
  78.     conf->num = NGX_CONF_UNSET;
  79.     return conf;
  80. }
  81. // 読み取ったconfの値をマージする
  82. static char *
  83. ngx_http_sample_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
  84. {
  85.     ngx_http_sample_loc_conf_t *prev = parent;
  86.     ngx_http_sample_loc_conf_t *conf = child;
  87.     
  88.     ngx_conf_merge_value(conf->enable, prev->enable, 0);
  89.     ngx_conf_merge_uint_value(conf->num, prev->num, 10);
  90.     ngx_conf_merge_str_value(conf->key, prev->key, "key");
  91.     
  92.     return NGX_CONF_OK;
  93. }
  94. // 初期化処理
  95. static ngx_int_t
  96. ngx_http_sample_init(ngx_conf_t *cf)
  97. {
  98.     ngx_http_handler_pt        *h;
  99.     ngx_http_core_main_conf_t *cmcf;
  100.     cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
  101.     h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
  102.     if (h == NULL) {
  103.         return NGX_ERROR;
  104.     }
  105.     *h = ngx_http_sample_handler;
  106.     
  107.     return NGX_OK;
  108. }
  109. static ngx_int_t
  110. ngx_http_sample_handler(ngx_http_request_t *r)
  111. {
  112.     // ここに処理を記載する
  113.     ngx_http_sample_loc_conf_t *alcf;
  114.     
  115.     // conf読み込み
  116.     alcf = ngx_http_get_module_loc_conf(r, ngx_http_sample_module);
  117.     
  118.     // onになっていなければ終了
  119.     if (!alcf->enable) {
  120.         return NGX_OK;
  121.     }
  122.     
  123.     // 取得した設定値を表示
  124.     ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module limit:%d", alcf->num);
  125.     ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "access sample module key:%V", &alcf->key);    
  126.     
  127.     return NGX_OK;
  128. }





nginx.confの指定はこうなります。


worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include     mime.types;
    default_type application/octet-stream;
    error_log /opt/nginx/logs/error.log debug;
    sendfile        on;

    server {
        listen     80;
        server_name localhost;

        location / {
            # 作ったモジュールを呼び出す
            sample on;
            sample_num 50;
            sample_access_key "Symfoware";
            root html;
            index index.html index.htm;
        }
    }
}





動かしてみると、ログに狙い通りの文字が出力されました。


2014/12/14 13:52:36 [debug] 5311#0: *1 access sample module limit:50
2014/12/14 13:52:36 [debug] 5311#0: *1 access sample module key:Symfoware


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/12/14(日) 13:58:12|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<nginx 拡張モジュール SHA1ハッシュの計算とbase64エンコード | ホーム | nginx 拡張モジュール サーバー時間を取得>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1567-bc3e0bda
この記事にトラックバックする(FC2ブログユーザー)