搭建nginx 服务器时,主要的配置文件nginx.conf 是部署和维护服务器人员经常要使用到的文件, 里面进行了许多服务器参数的设置。那么nginx 以模块module 为骨架的设计下是如何运用模块module 来解析并执行nginx.conf 配置文件下的指令的呢?在探究源码之前,需要对nginx 下的模块module 有个基本的认知(详情参考前面的博文 Nginx 源码分析– 浅谈对模块module 的基本认知 )同时也要对nginx 中常用到的一些结构有个基本的了解如: 内存池pool 管理相关的函数、ngx_string 的基本结构等(详情参考前面的博文),若不然看代码的时候可能不能很明晰其中的意思,本文着重探究的是解析执行的流程。
1 、从main 函数说起。
Nginx 的main 函数在nginx.c 文件中(本文使用release-1.3.0 版本源码 ,200 行),因为是主函数其中涉及到了许许多多的功能模块的初始化等内容,我们只关注我们需要的部分。看到326 行:
可以看出来,这里对ngx_modules (Nginx 源码分析– 浅谈对模块module 的基本认知中有介绍)进行了索引编号,并且计算得到模块的总数ngx_max_module 。然后,对cycle 进行初始化,跳转到ngx_init_cycle 中。对于cycle 这个变量是nginx 的核心变量,可以说模块机制都是围绕它进行的,里面的参数比较复杂涉及到的内容十分多,本文并不详细对它讨论,可以将其看作是一个核心资源库。
2 、ngx_init_cycle 函数
这个函数在文件ngx_cycle.c 中(43 行),这个函数是nginx 初始化中最重要的函数之一,里面涉及到与cycle 变量相关的初始化工作,看到第188 行
这里获取了ngx_max_module 个指针空间,用来保存每个模块的配置信息,从cycle 变量的字段conf_ctx 命名中就可以知道,ctx 为context 上下文的缩写。接下来看到,下面这段:
意思就是获取模块中属于NGX_CORE_MODULE 类的模块,如果需要创建配置信息就创建相应的配置信息,并且将地址保存在先前创建好的cycle->conf_ctx 地址空间中,完成核心模块配置文件的创建过程,至此前期工作就基本完成了。
前面conf 的赋值那段,无非是对conf 进行些必要的初始化。注意一下这里解析的都是对核心模块进行的,创建的配置文件也只是核心模块。关键的函数开始出现了:ngx_conf_param(&conf)将conf 需要的参数(可能没有就是空)存到conf 中,ngx_conf_parse (&conf, &cycle->conf_file)解析配置文件!
3 、函数ngx_conf_parse 指令解析函数,关键函数!
在以上代码中,除了将关键函数用红色标记以外,还特意将 函数中 对上下文的保存和还原 工作的地方进行了红色标记,因为在nginx源码中经常使用到这种机制,可以记住下这样的写法。
4、函数ngx_conf_handler 指令处理函数,关键函数!
写到这里时间已经有些晚了,小结一下。通过代码摘录的介绍,将整个nginx.conf解析的流程 概括的演示了出来,对于其中的些地方可能还不明晰如:二级模块的指令是如何执行的(就是 events{ … }、http{ … } 括号里面的指令如何执行的)、非核心模块是如何加入对 nginx.conf 这个配置文件进行解析 等一些内容,在后面的分析中再写吧。晚安!
Original: https://www.cnblogs.com/jzhlin/archive/2012/06/18/nginx_conf_1.html
Author: Java研究者
Title: Nginx 源码分析– 模块module 解析执行 nginx.conf 配置文件流程分析 一
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616196/
转载文章受原作者版权保护。转载请注明原作者出处!