1

データファイルからいくつかのURLペアを読み取り、その内容をnginxの共有メモリ内のrbツリーに格納する小さなnginxモジュールを作成しています。ハンドラーのコードでは、ツリーの内容がリクエストURIと照合され、特定の条件に基づいてリダイレクトが実行されます。
これは現時点では正常に機能します。モジュールは、構成後のフェーズで関数ngx_http_mymodule_initで起動し、共有メモリを追加して、後でnginxによって呼び出されるinit関数を割り当てます。

ngx_http_mymodule_init(ngx_conf_t *cf) {
    [...]
  ngx_http_mymodule_shm_zone = ngx_shared_memory_add(...);
    [...]
  ngx_http_mymodule_shm_zone->init = ngx_http_mymodule_init_shm_zone;           
  return NGX_OK; 
}

そして、そのinit_shm_zone関数は、ツリーを作成し、データファイルを読み取り、ツリーの内容を初期化する関数です。
ただし、仮想サーバーごとに1つのデータファイルが必要なので、次のように、nginx構成ディレクティブから入力データファイルのパスを読み取る必要があります。

static ngx_command_t ngx_http_mymodule_commands[] = {
  [...]
  { ngx_string("mymodule_input_filepath"),
    NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
    ngx_conf_set_str_slot, // should be ngx_conf_set_path_slot i guess...
    NGX_HTTP_SRV_CONF_OFFSET,
    offsetof(ngx_http_mymodule_srv_conf_t, input_filepath),
    NULL },
  ngx_null_command
};

...次に、そのファイルパスを使用してファイルを開き、その内容を共有メモリに保存します。ただし、ngx_http_mymodule_init関数では、configオブジェクトにアクセスできないため、ファイル名を読み取ることができません。
だから、私の質問は、サーバー構成からファイル名を読み取り、それを使用して共有メモリを初期化できるように、初期化コードをフックする必要があるハンドラーまたはフェーズはどれですか?
構成ファイルが解析された後、共有メモリが作成された後、実際の要求処理の前のどこかにある必要があります。init_masterハンドラーとinit_processハンドラーにフックしようとしましたが、これらのハンドラーがパラメーターとして受け取るサイクルオブジェクトから構成オブジェクトを見つけることができないようです...

4

1 に答える 1

2
mmcf = (ngx_my_module_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_my_module);

例については、こちらを参照してください: http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_regex.c#L316

于 2012-11-19T13:38:57.783 に答える