F5社区-F5技术交流中心

揭开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

Login

手机号
验证码
© 2019 F5 Networks, Inc. 版权所有。京ICP备16013763号-1