Module 初始化nginx模块';s共享内存取决于服务器配置指令

Module 初始化nginx模块';s共享内存取决于服务器配置指令,module,nginx,Module,Nginx,我正在编写一个小的nginx模块,它从数据文件中读取一些url对,然后将其内容存储在nginx共享内存中的rb树上。在处理程序的代码中,树内容与请求uri匹配,并根据特定条件执行重定向。 现在这个很好用。在后配置阶段,模块在函数ngx_http_mymodule_init处启动,在这里它添加共享内存并分配稍后将由nginx调用的init函数 ngx_http_mymodule_init(ngx_conf_t *cf) { [...] ngx_http_mymodule_shm_zon

我正在编写一个小的nginx模块,它从数据文件中读取一些url对,然后将其内容存储在nginx共享内存中的rb树上。在处理程序的代码中,树内容与请求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函数是创建树、读取数据文件并初始化树内容的函数。
但是每个虚拟服务器应该有一个数据文件,因此我需要从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_主进程和init_进程处理程序,但似乎无法从这些处理程序作为参数接收的cycle对象中找到config对象

mmcf = (ngx_my_module_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_my_module);
例如,请参见此处:

感谢您的输入,我已经尝试过了,但我的ngx\u my\u module\u srv\u conf对象仍然为空。可能该方法仅对主conf对象有效?或者init模块太早了,无法访问它?我会尽力找出答案并在这里发布…当然是空的。只有在收到请求后才选择“服务器”配置。试图在服务器级别配置共享内存区域可能是做错了什么。如果你看任何使用shm的nginx模块,你会发现它总是在主层。当然,请看,,,等等!如果您没有请求,您不知道它是哪台服务器。。。我将把共享内存init移到主级别,并在那里保存我所有服务器的数据。谢谢。如果不更改共享内存,只在启动时读取数据,为什么还要使用共享内存呢?或者我错了,在处理请求时您的rbtree被更改了?我只需要将所有请求与启动时从文件读取的重定向列表进行匹配。在重新启动/重新加载之前,不进行任何修改。我想把它读到共享内存是唯一的选择。。。有更好的方法吗?(编辑:列表会很大,就像数千个可能的重定向一样)那么你就不需要共享内存了。您可以在配置阶段在堆内存中读取它,并将指针保存在conf结构中(main、loc或serv并不重要)。你应该读一些关于和。Nginx在读取和初始化配置后会将自己转移到一堆工作进程。顺便说一句,为什么要创建一个新模块,而不使用它呢?