我正在写一个nginx模块。 从查看其他示例我在我的模块postconfiguration hook中注册我的头文件过滤器:
static ngx_int_t
mod_py_postconfig(ngx_conf_t *cf)
{
ngx_http_next_header_filter = ngx_http_top_header_filter;
ngx_http_top_header_filter = mod_py_headers_filter;
return NGX_OK;
}
但是从不调用处理程序。我在ngx_http_top_header_filter更改中在gdb中设置了一个断点,看起来我的模块的postconfig首先被调用,但是后来运行了ngx_http_write_filter_module的postconfig,它覆盖了ngx_http_top_header_filter,没有存储旧值:
static ngx_int_t
ngx_http_write_filter_init(ngx_conf_t *cf)
{
ngx_http_top_body_filter = ngx_http_write_filter;
return NGX_OK;
}
它似乎被设计为被调用的最后一个,那么为什么我的模块的postconfig首先被调用?
从我所看到的模块顺序在objs / ngx_modules.c中设置
我能够通过手动重新排序模块来解决问题,以便我的模块在ngx_http_header_filter_module之后,但这感觉就像一个丑陋的黑客,并且也很难自动化构建过程,因为./configure每次都会覆盖这个文件
答案 0 :(得分:6)
我正在将我的模块添加到错误的列表中。 nginx模块通过模块目录中的“config”文件进行配置。我的内容如下:
HTTP_MODULES="$HTTP_MODULES ngx_http_my_module_name"
我搜索了HTTP_MODULES用法并找到了实际构建nginx/auto/modules
文件的ngx_modules.c
脚本。事实证明,nginx/auto/modules
使用了几种可能的模块列表。我需要将我的模块添加到HTTP_AUX_FILTER_MODULES列表中,如下所示:
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_my_module_name"
这将我的模块放在HTTP_HEADERS_FILTER_MODULE之后的正确位置并解决了问题。