nginx过滤模块怎么生效的

在nginx中,如果你要开发一个过滤模块,config中必须要加

HTTP_FILTER_MODULES=$HTTP_FILTER_MODULES xxx

否则,即使在postconfiguration回调中加了ngx_http_top_header_filter=my_xxxx_filter_handle,最终my_xxxx_filter_handle也不会调用。这是如何做到的呢?

搜索HTTP_FILTER_MODULES,这个变量似乎没做什么事,就是保存了过滤模块而已。

我们知道只要加了HTTP_MODULES=$HTTP_MODULES xxx即可,我们的模块就生效了,而且postconfiguration也会被调用,在回调中设置了回调的链表。最终未被调用,其秘密就藏在了auto/modules这个脚本中

在其中搜索HTTP_FILTER_MODULES,可以看到:

这上面有段注释,说明了,过滤模块的顺序很重要,再往上则是说http模块顺序也很重要。

因此在HTTP_FILTER_MODULES下面有个ngx_module_order对模块进行了排序,这个决定了模块最终在全局变量ngx_modules数组中顺序位置。但是这里有个疑惑,这只是决定了模块在数组中的位置而已,他是如何决定config中加了HTTP_FILTER_MODULES变量后,过滤回调才能被调用的呢?

即,加了HTTP_FILTER_MODULES,你的过滤回调才能被调用,否则不可能。

以header_filter为例,

首先这个顺序是最重要,但是他是如何做到的呢?

答案就在ngx_http_header_filter_module这个模块中,

ngx_http_header_filter_module,是第一个被初始化的过滤模块

我们看其初始化函数:

static ngx_int_t

ngx_http_header_filter_init(ngx_conf_t *cf)

{

ngx_http_top_header_filter = ngx_http_header_filter;

return NGX_OK;

}

在这里,最先初始化ngx_http_top_header_filter,之后的模块则都是

xxx_next_header_filter=ngx_http_top_header_filter;

ngx_http_top_header_filter=xxx_header_filter;

依次来形成了回调链表。

如果我们的模块不是HTTP_FILTER_MODULES,那么我们的模块则一定排在ngx_http_header_filter_module之前,因此我们的模块被先初始化,即使我们挂了回调,那么等到调用ngx_http_header_filter_module模块初始化的时,直接重置了ngx_http_top_header_filter,使先前的链表直接失效了。这个排序在configiure执行后,可以在objs/ngx_modules.c可以看到。

nginx这样的设计是比较巧妙,如果你不显示告诉configure你是HTTP_FILTER_MODULES,那么最终程序中你的过滤回调就不会生效。

相关推荐
没差c42 分钟前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
AR-26710-1 小时前
Linux Day32——实操五类资源告急排查
linux·运维
skywalk81632 小时前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive
景煜拾年4 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
无人生还别怕4 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos
分布式存储与RustFS5 小时前
Hudi 表想摆脱 HDFS 绑定?用 Spark + Hudi 直接写进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
zhengfei6115 小时前
CVE-2026-98432:Linux 内核 TCP 释放后重用漏洞,CVSS 9.8 但补丁覆盖极不均衡
linux·运维·tcp/ip
逐流人5 小时前
DevOps 入门实战(一):从 CI/CD 概念到 Jenkins 自动构建部署
运维·云原生·云计算·jenkins·devops
xyzzklk5 小时前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
叼烟扛炮7 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php