揭开Nginx自定义配置项的秘密
2020-03-21 00:10:22
李煜峰
揭开Nginx自定义配置项的秘密
上一篇文章(Nginx 模块开发快速入门 )介绍了如何快速自定义一个简单的 HTTP 模块,在该模块里我们自定义了一个不带参数的配置项mymodule。而配置文件基本的一个作用就是对系统的参数进行配置,那么如何自定义一个带参数的配置项呢,它在设置上比无参数配置项会多些什么呢?本文就来对此进行一个探究。
本文完整代码地址:https://paste.ubuntu.com/p/FPnBdCVCSM
1. 示例配置
为了示例,文本自定义了两个配置项 mymodule 和name,其中 name 后可跟一个参数。
http {
server {
listen 80;
name F5;
location /mymodule/ {
name NGINX;
mymodule;
}
}
在该配置中,name 一共出现两次,在 server 块内的参数值为F5,而在 location 块内的参数值是 NGINX。一山难容二虎,这两个 name 到底谁才会最终生效呢?Nginx在这其中又是一个怎样的运行机制呢?下面我们就来一一揭秘。
2.Nginx配置模型内存布局
图 1 Nginx配置模型内存布局图
从图1中可以看到不同级别的配置块上下文存储不同级别的配置项参数,其中用于loc 级别的配置项由于可以出现在 http{},server{},location{}三个级别的配置块中,所以会被三个级别的配置块的上下文一共存储三次。server 级的会被存储两次,main 级的只会被存储一次放在 HTTP 块的配置块上下文 ngx_http_conf_ctx_t中。
三个级别的存储配置参数的结构体分别由 create_main_conf,create_srv_conf 和 create_loc_conf三个回调函数生成。
3. 自定义配置项
本模块 mymodule 用到的配置项参数数据结构定义如下:
我们定义name 配置项作用的细粒度是 location级别,所以定义了 create_loc_conf回调函数:
name 配置项虽然作用在 location 级别,但是我们也想让它在 server 配置块中出现,来表示对该 server 块的所有 location 都起作用,这时就需要对 commands 数组中 type 字段进行如下设置:
这样name就可以在同时出现 server 和 location 配置块中了,但这又牵涉到同名配置项冲突的问题,也就是前文所说的“一山难容二虎”,这个该怎么解决呢?优秀的 Nginx 也给我们提供了merge_conf的回调函数接口让我们去解决冲突问题。
在本模块中 parent 就是指 server 块中的配置项,child 就是指 location 块中的配置项。本文的合并逻辑是如果 server 块中定义了 name,就将 location 块内的 name 覆盖。
然后在 ngx_http_mymodule_handler函数发送响应包体时,需要对字符串进行一下构造,这个比较简单,直接看代码就 OK 了。
4.运行
最后就是编写 config文件,编译并运行啦。
config:
ngx_addon_name=ngx_http_mymodule_module
HTTP_MODULES="$HTTP_MODULES ngx_http_mymodule_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mymodule_module.c"
编译:
./configure --add-module=/root/nginx-1.16.1/module/mymodule
make
make install
结果:
5. 参考
《深入理解 Nginx:模块开发与架构解析》
https://www.nginx.com/resources/wiki/extending/api/
《Nginx 核心框架主要数据结构》:http://community.f5chinanetworks.com/f5network/pc/post/index?post_id=347
《Nginx 模块开发快速入门》:http://community.f5chinanetworks.com/f5network/pc/post/index?post_id=349
发布评论 加入社群
Olvan
2020-03-21 22:41:05
0
非常详细,赞!
相关文章

国内环境下ubuntu22.04+kubeadm搭建v1.27.2多节点k8s集群
宗兆伟
2023-06-16 07:12:11 277

更改 kibana 中图表的 index-pattern
李煜峰
2020-05-18 09:41:35 2046

Nginx内存池现实机制
皮皮鲁
2020-05-17 19:32:13 720

回复评论
发布评论