浏览 748
前面的nginx配置原理解析(一)我们重点阐述了nginx配置的起源,同时以http模块的配置为例勾勒了nginx配置数据结构在内存中的映像。本文继续(一)未完成的部分,仔细描述http块内的配置解析,同时为读者勾画整个解析完成后内存配置结构。
nginx http模块的配置一般形式如下:
http 块下面可以包含server块,而server块内也可嵌套location块,同时,每个模块的可以根据自己的需求将同一个配置同时出现在http、server、location块中,但是后续也必须得由自己决定,如上面示例的test_str。
在这里,我们简单描述下nginx配置解析过程以及函数调用关系。首先,nginx由许多模块构成,每个配置项应该是由其中的某个模块来解析,因此,整个模块解析过程其实就是“加载-发现-解析”的循环。
所有的模块配置解析都是由ngx_conf_parse()发起的。在这里先调用ngx_read_token()读取一个配置项,然后调用ngx_conf_handler()来解析配置项。以http模块为例,如遇到"http"这个指令时,会调用ngx_http_block()来解析整个http模块的配置。
关于ngx_http_block()函数初始化我们已经在(一)中仔细描述过了,并且给出了在内存中的映像图,今天我们就接着这个继续往下。
在(一)中我们讲到了ngx_http_block()过程的初始化,但是具体的解析我们未涉及。
这里我们调用每个模块的三个回调函数(不一定需要全部实现),并在内存中创建其映像关系。之所以需要创建loc_conf、server_conf、main_conf是因为nginx的某个配置可能会同时出现在main、server、location范围,我们需要创建这些映像以便于合并。
当准备工作完成以后,会正式进入配置解析流程
还是调用ngx_conf_parse()来解析配置,只是此时配置环境的上下文已经发生改变,cf->module_type = NGX_HTTP_MODULE,cf->cmd_type = NGX_HTTP_MAIN_CONF。表示此时要解析的是http模块的main block。
我们接下来重点研究对"server"指令的解析。整个调用的路径又变成了ngx_conf_parse()->ngx_conf_handler()。而ngx_conf_handler搜索到"server"指令的处理函数其实是由ngx_http_core_module的ngx_http_core_server()方法来解析。我们只关注这个函数最核心的部分:
这个函数
接下来,就解析位于server{}块内的配置了,解析的方法也是调用ngx_conf_parse,只是此时的上下文环境又发生了改变:cf->ctx = ctx;cf->cmd_type = NGX_HTTP_SRV_CONF。同时在此之前,会将该server对应的ngx_http_conf_ctx_t结构放在cmcf->servers数组中:
用文字来表述也就是:在http{}对应的ngx_http_core_module的main配置ngx_http_core_main_conf_t中有一个数组servers存储了http{}块下的所有的server的结构,主要是便于后续merge。以后在解析的时候没遇到一个server {},就会将该server对应的数据结构添加到servers数组中。
至此,nginx解析到这里的时候在内存中形成的配置项结构如下图所示:
对上图的理解:
按点赞数排序
按时间排序