nginx.conf文件中有http这个模块,里边可以加入各种子模块ngx_http_module_t ,这些子模块自定义conf的初始化过程如下??

一、几个结构

ngx_conf_t                  // 路人甲

ngx_http_XXX_(main|srv|loc)_conf_t     // 自定义的conf结构

ngx_command_t        // 各个Directives

ngx_http_module_t   // http中的子module

ngx_module_t           // 高层module

二、一些函数

http中子module初始化的过程:

main -> ngx_init_cycle -> ngx_conf_param -> ngx_conf_param -> ngx_conf_handler -> ngx_http_block -> ngx_http_merge_servers

在最后两个函数中调用了ngx_http_module_t结构中各个create、init和merge函数做自定义conf结构的初始化、合并等。

1. Main中调用了ngx_init_cycle,做了以下操作:

// ngx_module_t  ngx_http_module是NGX_CORE_MODULE

rv = module->create_conf(cycle);

cycle->conf_ctx[ngx_modules[i]->index] = rv;

conf.ctx = cycle->conf_ctx;. //此外的conf是一个ngx_conf_t

2. Ngx_init_cycle调用了ngx_conf_param,把上边conf传过来

ngx_conf_param(&conf)

3. Nginx_conf_param调用ngx_conf_parse

rv = ngx_conf_parse(cf, NULL);,又接收了上方

4. ngx_conf_parse调用ngx_conf_handler

rc = ngx_conf_handler(cf, rc);,又接收上方

5. Ngx_conf_handler中把conf取出并传给module中各命令的set函数。

conf = NULL;

if (cmd->type & NGX_DIRECT_CONF) {

conf = ((void **) cf->ctx)[ngx_modules[i]->index];

} else if (cmd->type & NGX_MAIN_CONF) {

conf = &(((void **) cf->ctx)[ngx_modules[i]->index]);

} else if (cf->ctx) {

confp = *(void **) ((char *) cf->ctx + cmd->conf);

if (confp) {

conf = confp[ngx_modules[i]->ctx_index];

}

}

rv = cmd->set(cf, cmd, conf);

6. Ngx_http_module_t中的http命令的set函数为ngx_http_block,其中做了一系列的各模块自定义的conf的创建、初始化等操作。最后调用的ngx_http_merge_servers又调用了各个merge函数。

for (m = 0; ngx_modules[m]; m++) {

ctx->main_conf[mi] = module->create_main_conf(cf);

ctx->srv_conf[mi] = module->create_srv_conf(cf);

ctx->loc_conf[mi] = module->create_loc_conf(cf);

}

for (m = 0; ngx_modules[m]; m++) {

module->preconfiguration(cf)

}

for (m = 0; ngx_modules[m]; m++) {

rv = module->init_main_conf(cf, ctx->main_conf[mi]);

rv = ngx_http_merge_servers(cf, cmcf, module, mi); // 此处调用了各merge

}

for (m = 0; ngx_modules[m]; m++) {

module->postconfiguration(cf)

}

7. ngx_http_merge_servers又调用了各个merge函数。

for (s = 0; s < cmcf->servers.nelts; s++) {

rv = module->merge_srv_conf(cf, saved.srv_conf[ctx_index],

cscfp[s]->ctx->srv_conf[ctx_index]);

rv = module->merge_loc_conf(cf, saved.loc_conf[ctx_index],

cscfp[s]->ctx->loc_conf[ctx_index]);

}

转载于:https://www.cnblogs.com/sunyongyue/archive/2011/09/05/ngx_http_module_conf_init.html

nginx http子模块conf的初始化相关推荐

  1. 通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx...

    为什么80%的码农都做不了架构师?>>>    通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx 脚本如下: ...

  2. nginx源码阅读(二).初始化:main函数及ngx_init_cycle函数

    前言 在分析源码时,我们可以先把握主干,然后其他部分再挨个分析就行了.接下来我们先看看nginx的main函数干了些什么. main函数 这里先介绍一些下面会遇到的变量类型: ngx_int_t: t ...

  3. Nginx源码分析-启动初始化过程(一)

    Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处.Nginx的初始化工作 ...

  4. Nginx如何更改conf配置文件

    安装Nginx默认的配置文件路径: /usr/local/nginx/conf/nginx.conf 默认的ngnix.conf: user nobody; worker_processes 8;pi ...

  5. nginx 多配置(.conf)的使用

    通常情况下我们在一个.conf 承载好多服务代理的配置,使用.conf 文件过大,过长,以至于管理难,有时修改某个小配置,由于重起或重截配置文件,使用服务受影响.因此使用多配置组合的方式进行管理很有必 ...

  6. nginx错误:unknown directive “锘? in F:\nginx/conf/nginx.conf:3

    用Nginx部署一个前端项目,用记事本修改了nginx\conf\nginx.conf 文件的相关配置并保存,居然启动时报错:unknown directive " " in D: ...

  7. docker安装nginx规范所有项目的反向代理(一个项目一个反向代理的conf配置文件)

    背景 centos7安装nginx比较麻烦,还是docker安装比较香. dokcer安装nginx比较简单,而且教程很多,那为什么还要总结? 这篇文章主要是规范化nginx对项目的反向代理,明显的特 ...

  8. nginx: [emerg] unknown directive “stub_status“ in /app/nginx/conf/conf.d/state.conf:7

    文章目录 一 发现问题 二 解决问题 1)找到编译安装时的nginx软件包,解压 2)配置相关参数 3)编译,安装 4)创建软链接和环境变量 5)确保配置文件正确 6)查看nginx进程 7)发送US ...

  9. 实现第一个自定义nginx模块

    实现第一个自定义nginx模块 下面的过程详细记录了如何实现第一个自定义的nginx模块,对nginx入门者包括我很有参考价值,特记录如下. 前提 假定以root身份已经在CentOS 6.8 x86 ...

最新文章

  1. java socket/Serversocket编程详解(中/英文)
  2. linux库函数mmap()原理及用法详解
  3. 应用系统开发思想的变迁
  4. C++ auto关键字
  5. FileDescriptor的作用
  6. 关于微信小程序swiper的问题
  7. 正态分布概率表_三、统计概率思维
  8. 了解spring-boot-starter
  9. python 获取当前日期和时间_如何在Python中获取当前日期和时间?
  10. 导入html文件到onenote,onenote怎么导入文件 onenote添加文件附件的图文步骤
  11. Eclipse —— 官网下载地址
  12. 【Python函数优化】
  13. ISP封了80和8080端口
  14. 「武汉理工大学 软件工程复习」第三章 | 软件需求
  15. Identifying Antioxidant Proteins by Using Optimal Dipeptide Compositions论文笔记
  16. 简单的网络打印的配置与管理(IP地址...)
  17. pytorch实现yolov4_v2(网络模块)
  18. 推荐一款绝对不能错过的 ORM 框架 dbVisitor,目前版本 4.3.0
  19. 【java类型转换】
  20. 图像处理--传统的手工特征之HOG

热门文章

  1. flink的DAG可视化使用(visualizer的使用)
  2. NoNode for /hbase/hbaseid解决方案
  3. linux英文系统+搜狗输入法
  4. java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object解决
  5. 机器学习(三十五)——Actor-Critic, Integrating Learning and Planning(1)
  6. 深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout
  7. 线性代数导论3——乘法与逆矩阵
  8. mysql常用sql语句优化
  9. MySQL专题—— 从认识索引到理解索引【索引优化】
  10. Windows10系统安装 .NET Framework 3.5