Nginx源码分析之中原六仔源码修复

Nginx的配置结构复杂至极,比Nginx其他模块的都复杂,想要彻底搞清楚,还需要下功夫。下面是个人的一些理解。中原六仔源码修复(企 娥:217 1793 408)

if (cmd->type & NGX_DIRECT_CONF) {
/"daemon" "worker_processes"等指令为NGX_DIRECT_CONF指令
其实也是NGX_MAIN_CONF指令,但是先判断了NGX_DIRECT_CONF所以走这个分支
*/
conf = ((void **) cf->ctx)[ngx_modules[i]->index];

} else if (cmd->type & NGX_MAIN_CONF) {
/例如"http" "mail" "events" 等指令为 NGX_MAIN_CONF 指令/
conf = &(((void **) cf->ctx)[ngx_modules[i]->index]);

} else if (cf->ctx) {
/这些指令都是隶属于上层指令之下的指令,比如HTTP的server指令等/
confp = *(void *) ((char ) cf->ctx + cmd->conf);

if (confp) {
    conf = confp[ngx_modules[i]->ctx_index];
    printf("-- else conf:%p\n", conf);
}

}

NGX_DIRECT_CONF和NGX_MAIN_CONF表示是配置文件的最外层指令,不同点在于DIRECT和NGX_MAIN_CONF配置的内存操作有差异。

cf->ctx都是在 函数 ngx_init_cycle中通过cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module sizeof(void ))获取得到的内存。
所以 DIRECT类型 指令 获取的 conf 是 cycle->conf_ctx[index],而 MAIN 类型指令获取的 conf 是&cycle->conf_ctx[index]。

对于DIRECT指令,获取到的conf是自己create_conf返回的内存。 例如 ngx_core_module_create_conf、ngx_regex_create_conf等core module的create_conf注册函数,所以 cmd->set 中直接使用这个conf就行了。

对于MAIN指令,conf取得是 cycle->conf_ctx[index] 的地址而不是里面的值,其实纯MAIN指令,没有create_conf指令,cf->ctx[index]取出来也是NULL,所以取conf = &cf->ctx[index]的目的,就是取二级指针,然后在cmd->set函数中,执行类似*conf = malloc(..)的操作,相当于对cf->ctx[index]进行赋值。

话句话说,MAIN指令,其ctx不可能由create_conf简单的创建出来或者压根不需要在create_conf阶段创建内存,所以需要在cmd->set中自行处理。

原文地址:http://blog.51cto.com/13862029/2139807

时间: 2024-08-03 10:44:53

Nginx源码分析之中原六仔源码修复的相关文章

手机自动化测试:appium源码分析之bootstrap六

手机自动化测试:appium源码分析之bootstrap六 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开发工程师就业培训请大家咨询qq:908821478)移动端自动化测试是未来的测试工程师的技术要求,我们需要打好基础. Flick package io.appium.android.bootstrap.handler; import com.android.uiautomator.core.UiDev

zg手册 之 python2.7.7源码分析(4)-- pyc字节码文件

什么是字节码 python解释器在执行python脚本文件时,对文件中的python源代码进行编译,编译的结果就是byte code(字节码) python虚拟机执行编译好的字节码,完成程序的运行 python会为导入的模块创建字节码文件 字节码文件的创建过程 当a.py依赖b.py时,如在a.py中import b python先检查是否有b.pyc文件(字节码文件),如果有,并且修改时间比b.py晚,就直接调用b.pyc 否则编译b.py生成b.pyc,然后加载新生成的字节码文件 字节码对象

QtCreator源码分析(一)——QtCreator源码简介

QtCreator源码分析(一)--QtCreator源码简介 一.QtCreator简介 QtCreator是设计精巧的插件式系统,QtCreator的核心是一个插件管理器,其所有功能都是使用插件完成.在启动时,QtCreator会首先加载一个名为coreplugin的插件,coreplugin插件提供了Qt Creator最基本的功能和扩展点,其余的插件都是直接或间接依赖于coreplugin插件提供的机制,一步步扩充QtCreator的功能,最终将其变成一个功能完整的IDE.针对QtCre

mysql实现秒值转换中原六仔平台搭建

需求:求一个人的在线时间,中原六仔平台搭建统计出来的为秒值,需转换成指定格式显示,企 娥:217 1793 408 开始想找有什么函数可以这么做,结果试了好几个 不稳没起作用,还是得通过计算concat 拼接 整除3600 取得小时数,余3600 整除 60 取得分钟 回顾mysql的 整除方法 一. 整除:div 5 div 2 = 2; 二. 取余:mod 5 mod 2 = 1; 三. 四舍五入:round round(1.5) = 2; sql如下: SELECT concat(conc

OpenGL着色器中原六仔平台搭建程序解析--3D拾取

3D拾取指的是中原六仔平台搭建论坛:haozbbs.com Q1446595067 将鼠标在屏幕上点击的位置匹配到3d游戏场景中的某个图元上,该图元投影到屏幕上的像素恰好就是鼠标点击的像素.3D场景在很多交互情境中有重要作用,使开发者的应用能够将用户的点击对应到场景空间中的物体上.例如:用户可以通过点击选中某个物体或者物体的某一部分进行删除等后续操作.在这个教程中的demo中,我们将渲染几个物体,并且展示如何使用红色标记选中的三角形图元使其突出显示. 为了实现3D拾取,我们将用到第23章阴影贴图

中原六仔平台搭建实时同步系统

Rsync 优点中原六仔平台搭建Q1446595067 rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期地备份文件服务器数据到远程服务器上,对本地磁盘定期进行数据镜像等.Rsync 不足 随着应用系统规模的不断扩大,对数据的安全性和可靠性提出了更高的要求,rsync便暴露出了很多不足之处.首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输.如果文件数量达到了百万量级及以上时,扫描文件就非常耗费时间,有时还会

ABP源码分析四十六:ABP ZERO中的Ldap模块

通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供DefautValue.主要提供配置访问AD数据库的账号信息. LdapSettings/ILdapSettings:通过settingManager获取LDAP settings AbpZeroLdapModuleConfig/IAbpZeroLdapModuleConfig: 提供激活Ldap认证的配置.

ABP源码分析三十六:ABP.Web.Api

这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net webApi. AbpApiController:这是一个抽象基类,继承自ApiController,是AB WebApi系统中所有controller的基类.如下图中,其封装了ABP核心模块中提供的大多数的功能对象.同时实现了一些公共的方法.它有四个派生类:DynamicApiController<

ABP源码分析二十六:核心框架中的一些其他功能

本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSession使之与CLR的Session关联 IAbpSession:定义如下图中的四个属性. NullAbpSession:IAbpSession的一个缺省实现,给每个属性都给予null值,无实际作用 ClaimsAbpSession:实现了从ClaimsPrincipal/ClaimsIdentity