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 ...
随机推荐
- NSUserDefaults 简介
NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信 ...
- 【Luogu】P2569股票交易(单调队列优化DP)
题目链接 首先这题可以肯定的是朴素DP秒出.然后单调队列优化因为没接触过所以不会emmm 而且脑补没补出来 坐等四月省选倒数第一emmm 心态爆炸,偷懒放题解链接 #include<cstdio ...
- Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)
Problem 1004: 蛤玮打扫教室 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %l ...
- UVA12230 Crossing Rivers (数学期望)
题目链接 题意翻译 一个人每天需要从家去往公司,然后家与公司的道路是条直线,长度为 \(D\). 同时路上有 \(N\) 条河,给出起点和宽度\(W_i\) , 过河需要乘坐速度为\(V_i\) 的渡 ...
- 常用快捷键以及linux命令整理
关于快捷键的使用,网上有很多.自己在使用过程中不断整理用到的知识点.一个项目完成了就把涉及用到的快捷键和命令介绍给大家,都是一些比较基础的,常用的命令.希望大家有好的知识点,命令可以及时交流整理. 一 ...
- mysql监控指标
1.最大连接数监控 show VARIABLES like "max_connections"; //最大连接数 show global status like 'Threads_ ...
- iframe平铺到浏览器
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 微信小程序 赋值问题
通常我们在页面跳转传递过来的参数要用到页面渲染时或是请求接口回来的数据要用到页面渲染时 对page的data赋值可不能用简单的变量赋值,要用微信小微信专有的this.setData方法 Page({ ...
- 牛客网 Wannafly挑战赛9 A.找一找-数据处理
好几天没好好学习了(咸鱼晒干了) 把稍微没那么咸鱼的几天前的一场牛客网的比赛稍微看了一下,菜的要死,这一场大数的比较多,都死了. A.找一找 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- Codeforces Educational Round 33 题解
题目链接 Codeforces Educational Round 33 Problem A 按照题目模拟,中间发现不对就直接输出NO. #include <bits/stdc++.h> ...