Nginx:管理HTTP模块的配置项
参考资料<深入理解Nginx>
一个nginx.conf的例子
http {
mytest_num ;
server {
server_name A;
listen ;
mytest_num ;
location /L1 {
mytest_num ;
}
location /L2 {
mytest_num ;
}
}
server {
server_name B;
listen ;
location /R1 {
mytest_num ;
}
location /R2 {
mytest_num ;
}
}
}
核心结构体ngx_http_conf_ctx_t
typedef struct {
//指向一个指针数组,数组中的每个成员都是由所有HTTP模块的create_main_conf方法创建的存放全局配置项的结构体
void **main_conf;
//指向一个指针数组,数组中的每个成员都是由所有HTTP模块的create_srv_conf方法创建的存放与server相关的结构体
void **srv_conf;
//指向一个指针数组,数组中的每个成员都是由所有HTTP模块的create_loc_conf方法创建的存放与location相关的结构体
void **loc_conf;
} ngx_http_conf_ctx_t;
管理main级别下的配置项
在处理http{}块内的main级别配置项时,对每个HTTP模块,都会调用create_main_conf、create_srv_conf、create_loc_conf方法建立3个结构体。
它们将以下面所示的数据结构保存起来

管理server级别下的配置项
在解析main级别配置项时,如果发现了server{}配置项,就会回调ngx_http_core_server方法解析srv级别的配置项。
在处理server{}块内的srv级别配置项时,对于每个HTTP模块,都会调用create_srv_conf、create_loc_conf方法建立两个结构体
(其main_conf指针指向所属的http块下ngx_http_conf_ctx_t结构体的main_conf指针数组)。
那么HTTP框架是如何管理srv级别的配置项的呢?事实上,在解析main级别的配置项时ngx_http_core_module模块的create_main_conf方法创建了一个很重要的结构体ngx_http_core_main_conf_t:
typedef struct {
//存储指针的动态数组,每个指针指向ngx_http_core_srv_conf_t结构体的地址,用于管理srv级别的配置项
ngx_array_t servers;
...
} ngx_http_core_main_conf_t;
而在解析srv级别配置项时,ngx_http_core_module模块会调用create_srv_conf方法创建一个ngx_http_core_srv_conf_t结构体:
typedef struct {
//指向当前server块所属的ngx_http_conf_ctx_t结构体
ngx_http_conf_ctx_t *ctx;
//当前server块的虚拟主机名
ngx_str_t server_name;
...
} ngx_http_core_srv_conf_t;
它们的关系如下图所示

管理location级别下的配置项
在解析srv级别配置项时,如果发现了location{}配置项,就会回调ngx_http_core_location方法来解析loc级别的配置项
在处理location{}块内的loc级别的配置项时,对于每个HTTP模块,都会调用create_loc_conf方法来建立一个结构体
(其main_conf和srv_conf指针都指向所属的server块下ngx_http_conf_ctx_t结构体的main_conf和srv_conf指针数组)。
那么location级别的配置项时如何管理起来的呢?首先在解析loc级别的配置项时,ngx_http_core_module模块会在create_loc_conf方法中生成ngx_http_core_loc_conf_t结构体:
struct ngx_http_core_loc_conf_s {
//location的名称,即nginx.conf中location后的表达式
ngx_str_t name;
//指向所属location块内ngx_http_conf_ctx_t结构体中的loc_conf指针数组,它保存着当前location块内所有HTTP模块crete_loc_conf方法产生的结构体指针
void **loc_conf;
//将同一个server块内多个表达location块的ngx_http_core_loc_conf_t结构体以双向链表方式组织起来,该locations指向ngx_http_location_queue_t结构体
ngx_queue_t *locations;
...
};
可以认为该结构体对应着当前解析的location块,因为它已经拥有足够的信息来表达一个location块:它的loc_conf成员可以引用到个HTTP模块在当前location块中的配置项
其中ngx_http_location_queue_t结构的定义如下
typedef struct {
//queue将作为ngx_queue_t双向链表勇气,从而将ngx_http_location_queue_t结构体连接起来
ngx_queue_t queue;
//如果location中的字符串可以景区匹配,exact将指向对应的ngx_http_core_loc_conf_t结构体
ngx_http_core_loc_conf_t *exact;
//如果location中的字符串无法精确匹配,inclusive将指向对应的ngx_http_core_conf_t结构体,否则为NULL
ngx_http_core_loc_conf_t *inclusive;
//指向location的名称
ngx_str_t *name;
...
} ngx_http_location_queue_t;
Nginx将ngx_http_core_loc_conf_t用双向链表组织起来,也就是把location级别的配置项结构体管理起来了。
(其中所属srv配置块中ngx_http_core_module模块在create_loc_conf方法中生成ngx_http_core_loc_conf_t结构体为链表的首元素),具体结构如下图

合并不同级别的配置项
HTTP框架提供了merge_srv_conf方法用于合并main级别和srv级别的server相关的配置项,
同时,它还提供了merge_loc_conf方法用于合并main级别、srv级别、loc级别的location相关的配置项。
合并不同级别的配置项的步骤如下:
1.遍历所有HTTP模块,如果该模块实现了merge_srv_conf方法,则调用该方法来合并main级别和srv级别的server相关的结构体;
2.遍历所有HTTP模块,如果该模块实现了merge_loc_conf方法,先将main级别和srv级别的location相关的结构体合并,
然后将srv级别和loc级别的location相关的结构体合并。
Nginx:管理HTTP模块的配置项的更多相关文章
- 【Nginx】核心模块ngx_events_module
核心模块ngx_events_module是一个专门用于管理事件模块的模块. 它的实现非常easy.以下是该模块的定义: ngx_module_t ngx_events_module = { NGX_ ...
- Nginx 的 RTMP 模块的在线统计功能 stat 在 multi-worker 模式下存在 Bug
< 让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能>一文介绍了 Nginx 的在线统计模块. 我们的在线直播服务使用了 Nginx 的 Rtmp ...
- RedHat7安装Nginx及第三方模块
编译安装Nginx 先安装编译过程中所需依赖包# yum -y install gcc pcre-devel openssl-devel zlib-devel jemalloc(更好的内存管理)# w ...
- nginx上传模块nginx_upload_module和nginx_uploadprogress_module模块进度显示,如何传递GET参数等。
ownload:http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gzconfigure and make : . ...
- Nginx开发HTTP模块入门
Nginx开发HTTP模块入门 我们以一个最简单的Hello World模块为例,学习Nginx的模块编写.假设我们的模块在nginx配置文件中的指令名称为hello_world,那我们就可以在ngi ...
- Nginx:HTTP过滤模块
参考资料<深入理解Nginx> HTTP过滤模块也是一种HTTP模块,与普通HTTP处理模块不同在于: 1.一个请求仅由一个HTTP处理模块处理,而可以被任意个HTTP过滤模块处理 2.普 ...
- nginx內建模块使用
目录 nginx內建模块使用 1. 內建模块的引入 1.1 查看安装信息 1.2 重新指定配置信息 2. 內建模块的使用 2.1 http_stub_status_module 2.2 http_ra ...
- FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块(转)
1.Nginx的FastDFS模块什么作用? 我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传.下载.删除等操作.同时通过 FastDFS的HTT ...
- Nginx 常用基础模块
目录 Nginx 常用基础模块 Nginx日志管理 nginx日志切割 Nginx目录索引 Nginx状态监控 Nginx访问控制 Nginx访问限制 Nginx 请求限制配置实战 Nginx Loc ...
随机推荐
- QT5.3 杂记(转)
原文转自 https://www.cnblogs.com/aoldman/p/3968280.html Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt ...
- AJAX中的同步加载与异步加载
AJAX是四个单词的简写,其中Asynchronous即异步的意思,异步的链接可以同时发起多个,并且不会阻止JS代码执行.与之对应的概念是同步,同步的链接在同一时刻只会有一个,并且会阻止后续JS代码的 ...
- PE文件从文件加载到内存,再从内存读取,然后存盘到文件
// mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...
- Fiddler抓包2-只抓APP的请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6582437.html 前言 fiddler抓手机app的请求,估计大部分都会,但是如何只 ...
- Reporting Services的简单使用
最近公司的功能需要使用报表,用的是微软自带的报表,谈一谈我们的做法,希望可以给想学习的人一些指导 1:新建報表所需的數據源DataSet.cs using System; using System.C ...
- HDU 2586.How far away ?-在线LCA(ST)-代码很认真的写了注释(捞到变形)
2018.9.10 0:40 重新敲一遍,然后很认真的写了注释,方便自己和队友看,刚过去的一天的下午打网络赛有一题用到了这个,但是没写注释,队友改板子有点伤,因为我没注释... 以后写博客,代码要写注 ...
- 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】
链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...
- 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)
模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...
- Jmeter插件之PerfMon监控插件使用说明
PerfMon是Jmeter用来监控系统资源的一款插件,可以用来监控系统的cpu.内存.I/O等性能指标. 首先是Jmeter的插件安装,需要先下载JMeter Plugins Manager这个插件 ...
- NMAP输出结果中CPE的含义
NMAP输出结果中CPE的含义 CPE全称是Common Platform Enumeration,意思是通用平台枚举项.它是NMAP对识别出来的软件.操作系统和硬件的一种命名方式.它的格式如下: ...