• 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,对指令解析后进行处理

  • 相关阅读:
    该死的兼容性
    Tip:解决DesignMode不能正确反应是否处于设计模式的问题
    Oh, ListView里竟然什么也不显示,也不报错!
    Tip: Dock is better than Anchor
    Tip: Asp.net下载默认文件名里包含空格时,如何防止FireFox只截取空格前一部分作为文件名
    c#的DateTime.Now函数详解
    C#中的委托和事件(初稿)
    C#多线程学习
    .NET(c#)new关键字的三种用法
    Silverlight – WCF – MaxItemsInObjectGraph
  • 原文地址:https://www.cnblogs.com/wully/p/2312751.html
Copyright © 2020-2023  润新知