如何正确注册nginx头过滤器?

Vit*_*ner 2 nginx

我正在写一个nginx模块.从查看其他示例我在我的模块postconfiguration钩子中注册我的头文件过滤器:

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;
}
Run Code Online (Sandbox Code Playgroud)

但是从不调用处理程序.我在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;
}
Run Code Online (Sandbox Code Playgroud)

看起来它被设计为最后一次调用,那么为什么我的模块的postconfig首先被调用?

从我所看到的,模块的顺序在objs/ngx_modules.c中设置

我能够通过手动重新排序那里的模块来解决这个问题,以便我的模块在ngx_http_header_filter_module之后,但这感觉就像一个丑陋的黑客,并且也很难自动化构建过程,因为./configure每次都会覆盖这个文件.

Vit*_*ner 6

好的,所以我自己弄清楚了.在这里记录它,以防其他人需要它.

我正在将我的模块添加到错误的列表中.nginx模块通过模块目录中的"config"文件进行配置.我的内容如下:

HTTP_MODULES="$HTTP_MODULES ngx_http_my_module_name"
Run Code Online (Sandbox Code Playgroud)

我搜索了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"
Run Code Online (Sandbox Code Playgroud)

这将我的模块放在HTTP_HEADERS_FILTER_MODULE之后的正确位置并修复了问题.