nginx的配置实现

nginx配置主要来源有两部分,一个来源是通过命令行 -g传入的指令,另一个来源是通过配置文件。(配置文件可以通过 -c指定,默认为 conf/nginx.conf

配置的实现

 配置实现是在nginx初始化cycle里面进行的ngx_init_cycle(&init_cycle)

首先调用ngx_conf_param(&conf) ,对通过 -g导入的指令进行解析,如果存在的话。

该指令通过&cf->cycle->conf_param获取,其中cf为上行的conf,对conf_file进行设置,目的在于告诉指令解析器我这个配置只是对单指令进行解析。并非来自于文件,或者block模式【后面会有介绍】。

    conf_file.file.fd = NGX_INVALID_FILE;

    conf_file.file.name.data = NULL;

    conf_file.line = 0;

  

执行ngx_conf_parse(cf, NULL),这里面会进行判断,如果第二个参数存在,则解析第二个参数指定的文件,即文件作为配置体进行解析,如果第二个参数不存在,并且conf_file.file.fdNGX_INVALID_FILE则作为单条指令进行解析,否则对这个block进行解析,所谓block是指被大括号括起来的一系列指令。

我们这里是作为单指令来解析

调用ngx_conf_read_token(cf)把配置指令拆成token, 存储在cf->args,args为一个数组,每个token为一个word, 第一个wordkey,剩余的存value。例如  worker_processes  =  1 , 第一个word work_processes,第二个word 1

执行ngx_conf_handler  ,首先检测type是否是cftype或者NGX_CONF_MODULE,如果不是,一律忽略。在所有的模块中匹配指令的key,即上面的第一个word,如果匹配上了执行相应的set命令,该set为ngx_command_t中的set属性。一般执行完set就对各个模块的属性值进行了最终设置

调用ngx_conf_parse(&conf, &cycle->conf_file),对配置文件进行解析,这里面由于第二个参数存在,则对文件进行解析。当遇到 "{" 则对block进行解析,遇到 "}" 表示block解析完毕。

http指令的解析为例,当解析到“http{”时,系统进入block解析,且执行ngx_http_block函数,该函数为http指令的set函数,在这个函数里面对http的各个模块执行

module->create_main_conf

module->create_srv_conf

module->create_loc_conf

module->preconfiguration

递归调用ngx_conf_parse(cf, NULL),对里面的指令进行解析逐条解析

调用module->postconfiguration,对指令解析后进行处理

原文地址:https://www.cnblogs.com/wully/p/2312751.html