我正在编写一个小型 nginx 模块,它从数据文件中读取一些 url 对,然后将其内容存储在 nginx 共享内存中的 rb-tree 上。在处理程序的代码中,树内容与请求 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 函数中,我无法访问配置对象,因此无法读取文件名。
所以,我的问题是,我应该在哪个处理程序或阶段挂钩我的初始化代码,以便我可以从服务器配置中读取文件名并使用它来初始化我的共享内存?
它必须在配置文件被解析之后、共享内存创建之后、任何实际请求处理之前的某个地方。我试图挂钩 init_master 和 init_process 处理程序,但我似乎无法从这些处理程序作为参数接收的循环对象中找到配置对象......