nginx源代码分析--配置信息的继承&合并
这里仅仅讲述http{}模块下的配置:
在ngx_http_block()函数内(这个函数别调用时在ngx_inti_cycle内的ngx_conf_parse函数,这个函数遇到http命令时 回调ngx_http_block。开启http{}配置块的解读工作),针对每个http模块。调用init_conf之后,有调用了ngx_http_merge_servers()。
这是为何!
首先明白几点:一个http{}配置块内能够包括多个server{}配置块,每一个server{}配置块能够包括多个location{}配置块,每一个location{}配置块能够嵌套location{}配置块。把每一个使用{}包括起来的配置块称为一个层次。在ngx_http_block中调用ngx_conf_parse时,还调用了ngx_http_core_server和ngx_http_core_location 这两个函数是解析server{}块和location{]块的。
在不同的层次为同一个http模块创建了存储配置的结构体空间。比方在http{}层次为某一个http模块创建了
main_conf、srv_conf、loc_conf配置,在ngx_http_core_server内为同一个http模块创建了srv_conf loc_conf配置,在ngx_http_core_location函数内为同一个http模块创建了loc_conf配置。可是这是不同层次上的配置。对于某一个http模块中的某一个命令来说,它可能出现的区域有http{} server{} locaton{},假设在某一个server{}块内没有这个命令 那么它就须要从http{}中继承这个命令,假设某个server{}中存在这个命令,那么就不须要从http{}中继承;假设server{}中的某一个location{}中没有这个命令,那么就须要从上层(server{}层或者location{}层)继承,假设上层没有,直接从http{}中继承,或者使用默认。整个继承的流程如上所述。对于某一个http模块中的命令能够出现的层次是它本身自己知道的,怎么合并(使用函数merge_srv_conf和
merge_loc_conf函数回调)也是模块本身定义的。
正是模块中命令能够出如今不同区域才造成了继承合并的操作,这也是为了配置文件的灵活。
解析流程:在ngx_http_block函数中。
一个for循环为每个http模块调用init_main回调和ngx_http_merge_servers.
在ngx_http_merge_servers中一个for循环 须要遍历全部的server{}配置块。首先回调调用merge_srv_conf,从http上下文继承srv_conf配置。然后回调调用merge_loc_conf,从http上下文继承loc_conf配置,然后处理这个server{}块下的全部location{}块 调用ngx_http_merge_location
在ngx_http_merge_location中,首先从上文(server{]或者location{})继承loc_conf配置 然后处理location{]模块下的全部loction{}
nginx源代码分析--配置信息的继承&合并的更多相关文章
- Nginx源代码分析—业务流程
Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- 菜鸟nginx源代码剖析 配置与部署篇(一) 手把手实现nginx "I love you"
菜鸟nginx源代码剖析 配置与部署篇(一) 手把手配置nginx "I love you" Author:Echo Chen(陈斌) Email:chenb19870707@gm ...
- nginx源代码分析--进程间通信机制 & 同步机制
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...
- nginx源代码分析--配置文件解析
ngx-conf-parsing 对 Nginx 配置文件的一些认识: 配置指令具有作用域,分为全局作用域和使用 {} 创建其他作用域. 同一作用域的不同的配置指令没有先后顺序:同一作用域能否使用同样 ...
- nginx源代码分析之内存池实现原理
建议看本文档时结合nginx源代码. 1.1 什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...
- nginx源代码分析--event事件驱动初始化
1.在nginx.c中设置每一个核心模块的index ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]-> ...
- nginx源代码分析--GDB调试
利用gdb[i]调试nginx[ii]和利用gdb调试其他程序没有两样,只是nginx能够是daemon程序,也能够以多进程执行,因此利用gdb调试和寻常会有些许不一样. 当然,我们能够选择将ngin ...
随机推荐
- sysctl内核参数解析
sysctl内核参数解析 kernel.参数 kernel.shmall = 2097152 ## 1> 表示所有内存大小.可以分配的所有共享内存段的总和最大值.(以页为单位) ## 2& ...
- 项目记事【多线程】:关于 SimpledDateFormat 的多线程问题
背景: 最近项目引入了 SonarLink,解决代码规范的问题,在检查历史代码的时候,发现了一个问题. 先看代码: public class DateUtil { private static fin ...
- 【bzoj3505】[Cqoi2014]数三角形 容斥原理
题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入 输入一行,包含两个空格分隔的正整数m和n. 输出 输出一个 ...
- javascript事件捕获机制,dom tree
$(document,"a").on("click",function(){alert(2);return false;}); $("<a> ...
- 【MFC】Button控件和Picture Control的鼠标事件执行顺序
1.Button控件鼠标事件执行顺序 (1) WM_LBUTTONDOWN (2) WM_LBUTTONUP (3) OnBnClickedButton1(); 2.Picture Control的鼠 ...
- ListView列表刷新方法的区别
ListView列表刷新方法的区别 ListView对象的刷新方法: listNote.invalidate();重绘所有组件listNote.invalidateViews();重绘组件[包含所有的 ...
- iOS 总结网页常用的东西
webView与js交互常用JS语句::: 1. //禁用用户选择 [self.webView stringByEvaluatingJavaScriptFromString:@"docume ...
- vue 之循环添加不同class
在vue中按条件为class动态添加直接使用:class="[{ active: isActive }, errorClass]"之类的表达式就可以 但是如果我们要为一个循环列表按 ...
- 采集网站特殊文件Meta信息
采集网站特殊文件Meta信息 元(Meta)信息是描述文件的属性的特殊信息,如文件的所有者.联系方式.机构名.邮件地址等信息.而网站中常常会有共享的文档文件,如PDF.Excel.Word.这些文 ...
- 会话跟踪技术Cookieless
会话跟踪技术Cookieless 在Web应用中,通常使用Cookie记录用户的状态,如用户名.访问时间等信息.当进行HTTP请求的时候,会自动发送Cookie信息给服务器.服务器接收到,就可以判 ...