我正在写一个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每次都会覆盖这个文件.
好的,所以我自己弄清楚了.在这里记录它,以防其他人需要它.
我正在将我的模块添加到错误的列表中.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之后的正确位置并修复了问题.
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |