nginx http子模块conf的初始化
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的初始化相关推荐
- 通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx...
为什么80%的码农都做不了架构师?>>> 通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx 脚本如下: ...
- nginx源码阅读(二).初始化:main函数及ngx_init_cycle函数
前言 在分析源码时,我们可以先把握主干,然后其他部分再挨个分析就行了.接下来我们先看看nginx的main函数干了些什么. main函数 这里先介绍一些下面会遇到的变量类型: ngx_int_t: t ...
- Nginx源码分析-启动初始化过程(一)
Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处.Nginx的初始化工作 ...
- Nginx如何更改conf配置文件
安装Nginx默认的配置文件路径: /usr/local/nginx/conf/nginx.conf 默认的ngnix.conf: user nobody; worker_processes 8;pi ...
- nginx 多配置(.conf)的使用
通常情况下我们在一个.conf 承载好多服务代理的配置,使用.conf 文件过大,过长,以至于管理难,有时修改某个小配置,由于重起或重截配置文件,使用服务受影响.因此使用多配置组合的方式进行管理很有必 ...
- nginx错误:unknown directive “锘? in F:\nginx/conf/nginx.conf:3
用Nginx部署一个前端项目,用记事本修改了nginx\conf\nginx.conf 文件的相关配置并保存,居然启动时报错:unknown directive " " in D: ...
- docker安装nginx规范所有项目的反向代理(一个项目一个反向代理的conf配置文件)
背景 centos7安装nginx比较麻烦,还是docker安装比较香. dokcer安装nginx比较简单,而且教程很多,那为什么还要总结? 这篇文章主要是规范化nginx对项目的反向代理,明显的特 ...
- 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 ...
- 实现第一个自定义nginx模块
实现第一个自定义nginx模块 下面的过程详细记录了如何实现第一个自定义的nginx模块,对nginx入门者包括我很有参考价值,特记录如下. 前提 假定以root身份已经在CentOS 6.8 x86 ...
最新文章
- java socket/Serversocket编程详解(中/英文)
- linux库函数mmap()原理及用法详解
- 应用系统开发思想的变迁
- C++ auto关键字
- FileDescriptor的作用
- 关于微信小程序swiper的问题
- 正态分布概率表_三、统计概率思维
- 了解spring-boot-starter
- python 获取当前日期和时间_如何在Python中获取当前日期和时间?
- 导入html文件到onenote,onenote怎么导入文件 onenote添加文件附件的图文步骤
- Eclipse —— 官网下载地址
- 【Python函数优化】
- ISP封了80和8080端口
- 「武汉理工大学 软件工程复习」第三章 | 软件需求
- Identifying Antioxidant Proteins by Using Optimal Dipeptide Compositions论文笔记
- 简单的网络打印的配置与管理(IP地址...)
- pytorch实现yolov4_v2(网络模块)
- 推荐一款绝对不能错过的 ORM 框架 dbVisitor,目前版本 4.3.0
- 【java类型转换】
- 图像处理--传统的手工特征之HOG
热门文章
- flink的DAG可视化使用(visualizer的使用)
- NoNode for /hbase/hbaseid解决方案
- linux英文系统+搜狗输入法
- java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object解决
- 机器学习(三十五)——Actor-Critic, Integrating Learning and Planning(1)
- 深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout
- 线性代数导论3——乘法与逆矩阵
- mysql常用sql语句优化
- MySQL专题—— 从认识索引到理解索引【索引优化】
- Windows10系统安装 .NET Framework 3.5