【Nginx】HTTP配置模型
当Nginx检測到配置文件里存在配置块http{}时。会建立一个ngx_http_conf_ctx_t结构体,该结构体定义例如以下:
typedef struct {
void **main_conf; // 每一个指针元素指向全部由HTTP模块的create_main_conf方法产生的结构体
void **srv_conf; // 每一个指针元素指向全部由HTTP模块的create_srv_conf方法产生的结构体
void **loc_conf; // 每一个指针元素指向全部由HTTP模块的create_loc_conf方法产生的结构体
} ngx_http_conf_ctx_t;
ngx_http_conf_ctx_t *ctx; // 定义一个该结构体的指针 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); // 分配该结构体空间 ctx->main_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针
ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针
ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针 for (m = 0; ngx_modules[m]; m++)
{
if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
continue;
} module = ngx_modules[m]->ctx;
mi = ngx_modules[m]->ctx_index; if (module->create_main_conf)
{
/* 依次调用全部HTTP模块的create_main_conf方法
* 产生的结构体指针放入上面分配了空间的main_conf指针数组中
*/
ctx->main_conf[mi] = module->create_main_conf(cf);
if (ctx->main_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
} if (module->create_srv_conf)
{
/* 依次调用全部HTTP模块的create_srv_conf方法
* 产生的结构体指针放入上面分配了空间的srv_conf指针数组中
*/
ctx->srv_conf[mi] = module->create_srv_conf(cf);
if (ctx->srv_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
} if (module->create_loc_conf)
{
/* 依次调用全部HTTP模块的create_loc_conf方法
* 产生的结构体指针放入上面分配了空间的loc_conf指针数组中
*/
ctx->loc_conf[mi] = module->create_loc_conf(cf);
if (ctx->loc_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
}
}
- 当遇到server{}配置块时,建立ngx_http_conf_ctx_t结构体。main_conf成员指向父配置块所相应的ngx_http_conf_ctx_t结构体,srv_conf成员和loc_conf成员存储HTTP模块通过create_srv_conf和create_loc_conf方法产生的配置结构体指针。
- 当遇到location{}配置块时,建立ngx_http_conf_ctx_t结构体,main_conf成员指向父配置块相应ngx_http_conf_ctx_t结构体。srv_conf成员指向父配置块ngx_http_conf_ctx_t结构体的srv_conf元素。loc_conf存储HTTP模块create_loc_conf方法产生的配置结构体指针。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- Nginx进程主循环调用配置文件解析器解析nginx.conf配置文件。
- 配置文件解析器发现http{},启动HTTP框架,也就是核心模块ngx_http_module。
- 核心模块调用ngx_command_t中的set回调函数,也就是ngx_http_block方法。
- 初始化全部HTTP模块的序号。分配一个ngx_http_conf_ctx_t结构体并初始化三个数组。
- 调用每一个HTTP模块的create_main_conf、create_srv_conf、create_loc_conf方法分配存储配置项參数的结构体,返回的指针保存在ngx_http_conf_ctx_t结构体中。
- 调用每一个HTTP模块的preconfiguration方法。
- 配置文件解析器检測到一个配置项后。遍历全部HTTP模块的ngx_command_t数组,看有没有可以和配置项名称匹配的ngx_command_t结构体,有则调用ngx_command_t结构中的set方法来处理配置项。
- 配置文件解析器继续检測配置项,遇到server{}或location{}则以类似的方法递归解析块中的配置项,只是此时负责解析配置项的模块变成了ngx_http_core_module,方法在上面已经具体说明了。
- 配置文件解析器解析到http{}尾端,返回HTTP框架ngx_http_module。
- 调用merge_srv_conf和merge_loc_conf等方法合并配置项结构体。
- HTTP框架处理完http配置项,ngx_command_t的set回调方法返回。
- 配置文件解析器返回Nginx主循环。Nginx进程启动Web服务器。
【Nginx】HTTP配置模型的更多相关文章
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- nginx性能配置参数说明:
nginx的配置:main配置段说明一.正常运行的必备配置: 1.user username [groupname]; 指定运行worker进程的用户和组 2.pid /path/to/pidfile ...
- Nginx+tomcat配置集群负载均衡
开发的应用采用F5负载均衡交换机,F5将请求转发给5台hp unix服务器,每台服务器有多个webserver实例,对外提供web服务和socket等接口服务.之初,曾有个小小的疑问为何不采用开源的a ...
- nginx 详细配置
Nginx全局变量 Nginx中有很多的全局变量,可以通过$变量名来使用.下面列举一些常用的全局变量: 变量 说明 boxClass 需要执行动画的元素的 变量 说明 $args 请求中的参数,如ww ...
- Nginx 参数配置相关
Nginx参数配置相关 by:授客 QQ:1033553122 目的: 对Nginx配置的点滴学习总结,主要目的在于分析Nginx与性能相关的一些参数设置,以便性能调优时选择最优配置 环境: $ ...
- 写给大忙人的nginx核心配置详解
由于当前很多应该都是前后端分离了,同时大量的基于http的分布式和微服务架构,使得很多时候应用和不同项目组之间的系统相互来回调用,关系复杂.如果使用传统的做法,都在应用中进行各种处理和判断,不仅维护复 ...
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
- Nginx在windows上安装 及 Nginx的配置及优化
https://www.cnblogs.com/Chiler/p/8027167.html http://www.runoob.com/linux/nginx-install-setup.html 前 ...
- nginx下配置多个web服务
参考 nginx配置详解 nginx反向代理与负载均衡详解 一.nginx简介: Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能 ...
- nginx的开机自启、server命令启动、nginx.conf配置
1.将Nginx设置为开机自动启动 a.当上面6步完成之后,说明安装已经完全成功了,但是每次开机我们面临的一个问题,就是每次都要执行命令(1: cd /usr/local/nginx/sbin/ ...
随机推荐
- Linux Mint---安装docky
这个安装的时候没啥难度,直接在软件中心安装一下就可以了,效果很赞的,linux下最棒的dock, 简洁大方,效果好! 只不有过一点需要注意,这个东东直接很上拖是添加不上去的 需要从/usr/share ...
- DataTable 去重合并
//合并 dt.Merge(dt2); //去重 dt = dt.AsDataView().ToTable(true);
- 【IDEA】IDEA中更新Maven的索引与像Eclipse那样搜索坐标
1.添加坐标,像Eclipse那样搜索: 右击项目中pom.xml中,然后选择Generate(快捷键是Alt+Insert)->Dependency之后输入关键字查询 或者在pom.xml中直 ...
- Grep查看日志的方法【转】
转自:http://blog.csdn.net/stormkey/article/details/5905204 版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://go ...
- 华为上机测试题(地铁换乘-java)
PS:自己写的,自测试OK,供大家参考. /* 高级题样题:地铁换乘描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的.经过的站点名分别如下,两条线交叉的换乘点用T1.T2表示.编写 ...
- java基础练习 18
import java.util.Scanner; public class Eightheen { /*判断一个素数能被几个9整除*/ public static void main(String[ ...
- Gson解析json数据的案例一
转自:http://blog.csdn.net/l331258747/article/details/51547338: Android利用Gson解析嵌套多层的Json 首先先讲一个比较简单点的例子 ...
- nvm: node版本管理工具
安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash node 版本切 ...
- Ubunntu kylin下安装VmWare Tools(简洁方法)
1.在VM菜单栏单击虚拟机,选择安装Vmware tools(或者是重装Vmware Tools) 2.会弹出一个界面,就是光盘加载的那个界面,里面有个.******.gz文件 3.复制到桌面(你喜欢 ...
- HDU 1171.Big Event in HDU-动态规划0-1背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...