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

时间:2010-10-04 20:09:35

标签: nginx

我正在写一个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每次都会覆盖这个文件

1 个答案:

答案 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之后的正确位置并解决了问题。