nginx配置主要来源有两部分,一个来源是通过命令行 -g传入的指令,另一个来源是通过配置文件。(配置文件可以通过 -c指定,默认为 conf/nginx.conf)
配置的实现
配置实现是在nginx的初始化cycle里面进行的ngx_init_cycle(&init_cycle)
1 首先调用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.fd为NGX_INVALID_FILE则作为单条指令进行解析,否则对这个block进行解析,所谓block是指被大括号括起来的一系列指令。
我们这里是作为单指令来解析
调用ngx_conf_read_token(cf)把配置指令拆成token, 存储在cf->args,args为一个数组,每个token为一个word, 第一个word存key,剩余的存value。例如 worker_processes = 1 , 第一个word为 work_processes,第二个word为 1。
执行ngx_conf_handler ,首先检测type是否是cf的type或者NGX_CONF_MODULE,如果不是,一律忽略。在所有的模块中匹配指令的key,即上面的第一个word,如果匹配上了执行相应的set命令,该set为ngx_command_t中的set属性。一般执行完set就对各个模块的属性值进行了最终设置
2 调用ngx_conf_parse(&conf, &cycle->conf_file),对配置文件进行解析,这里面由于第二个参数存在,则对文件进行解析。当遇到 "{" 时则对block进行解析,遇到 "}" 表示block解析完毕。
3 以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,对指令解析后进行处理