【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/ ...
随机推荐
- [LeetCode] Binary Tree Inorder Traversal 中序排序
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- IOS VLC编译步骤(包含移植和截图功能)
http://blog.csdn.net/Kan_Crystal/article/details/40424673 一.下载源码 先到VLC官网将源码下载到本机,以下链接为官网编译操作地址:https ...
- 戴文的Linux内核专题:03 驱动程序【转】
转自:http://www.lai18.com/content/432194.html 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协 ...
- 图文详解前端CSS中的Grid布局,你真的可以5分钟掌握
前言 网站的布局是一个网站设计的根本,CSS的Grid布局已经成为了未来网站布局的基本方式. 今天这篇文章我们通过图文,一起看看如何自己实现Grid布局方式. CSS 第一个Grid布局 首先我们看看 ...
- POJ 2828.Buy Tickets-完全版线段树(单点更新、逆序遍历查询)
POJ2828.Buy Tickets 这个题是插队问题,每次有人插队的时候,其后的所有数据都要进行更新,如果我们反着推,就可以把所有的数据都安排好并且不用再对已插入的数据进行更新,因为逆序处理的话所 ...
- 51nod 1095 Anigram单词【hash/map/排序/字典树】
1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b ...
- FZU-2270 Two Triangles(两个三角形全等)
原题地址: 题意: 给出n个点,有两个人,每个人可以选3个点,问有多少种情况是可以找出两个三角形,是可以通过旋转使其全等. 思路: 所以首先要是三角形即三点不能共线,其次要全等,即三条边对应相等, ...
- System.getProperty("os.name")
Here is a handy Java class that useSystem.getProperty("os.name") to detect which type of o ...
- How to show only next line after the matched one?
awk '/blah/{getline; print}' logfile
- 学习Flash 3D图形图像知识的网络资源集合
1. 华中科技大学计算机学院开放式课程--计算机图形学 http://cs.hust.edu.cn/webroot/courses/csgraphics/index.php 2.深入Stage3D_7 ...