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 ...
随机推荐
- iOS学习笔记42-Swift(二)函数和闭包
上一节我们讲了Swift的基础部分,例如数据类型.运算符和控制流等,现在我们来看下Swift的函数和闭包 一.Swift函数 函数是一个完成独立任务的代码块,Swift中的函数不仅可以像C语言中的函数 ...
- 【bzoj3098】Hash Killer II 生日悖论
这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:给你一个长度为N的字符串S,求有多少个不同的长度为L的子串.子串的定义是S[l].S[l + 1].… S[r]这样连续的一段.两个字 ...
- 58同城职位分类数据 json
{ "level0": {"0": "销售", "1": "客服", "2": ...
- getID3类的学习使用
getID3类的学习使用 网上描述: getID3()这个PHP脚本能够从MP3或其它媒体文件中提取有用的信息如:ID3标签,bitrate,播放时间等. (格式包括:Ogg,WMA,WMV,ASF, ...
- 推荐!手把手教你使用Git(转)
原文出处: 涂根华的博客 欢迎分享原创到伯乐头条 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放 ...
- AC日记——联合权值 洛谷 P1351
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 微信小程序之微信支付C#后台(统一下单)
一.微信小程序支付 1.微信小程序端请求支付接口 商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付.具体可以查看接口示例. 接口传入参数示例: <xm ...
- 洛谷—— P1503 鬼子进村
https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的 ...
- loj #110. 乘法逆元
#110. 乘法逆元 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题. 给定 ...
- shell-异步执行
一.启动后台子任务 在执行命令后加&操作符,表示将命令放在子shell中异步执行.可以达到多线程效果.如下, sleep 10 #等待10秒,再继续下一操作 sleep 10 & #当 ...