Nginx配置指令内存布局示例
本文讲述 HTTP 模块配置指令内存使用情况。
配置指令保存地址
nginx 所有配置指令信息保存在全局变量 cycle->conf_ctx 中。
对应代码如下:ngx_cycle.h
struct ngx_cycle_s {
void ****conf_ctx;
......
}
HTTP模块指令指向的内存类型如下:
typedef struct {
void **main_conf;
void **srv_conf;
void **loc_conf;
} ngx_http_conf_ctx_t;
全局配置内存布局如下:
图1
配置指令内存布局示例
这里以配置指令 proxy_set_header
为例,说明该指令在不同位置下配置时的内存布局。proxy_set_header
指令官方说明如下:
Syntax:表示配置指令的语法
Default:表示配置指令默认取值
Context:表示配置指令的配置上下文
配置示例1
配置文件内容:
http{
proxy_set_header Test1 "a";
server {
proxy_set_header Test2 "b";
location {
proxy_set_header Test3 "c";
proxy_pass: https://www.baidu.com;
}
}
}
内存布局如下:
图2
由内存布局可知,转发给上游服务器的请求头域中仅包含 Test3: c
配置示例2
配置文件内容:
http{
proxy_set_header Test1 "a";
server {
proxy_set_header Test2 "b";
location {
# 注意这里 location 级别未配置
proxy_pass: https://www.baidu.com;
}
}
}
内存布局如下:
图3
由内存布局可知,转发给上游服务器的请求头域中仅包含 Test2: b
配置示例3
配置文件内容:
http{
proxy_set_header Test1 "a";
server {
# 注意这里 server 级别未配置
location {
# 注意这里 location 级别未配置
proxy_pass: https://www.baidu.com;
}
}
}
内存布局如下:
图4
由内存布局可知,转发给上游服务器的请求头域中仅包含 Test1: a
配置结构体关系
从以上示例可以看出,nginx 配置文件中每一个 server
、location
都对应一个结构体 ngx_http_conf_ctx_t
,那这些结构体是如何组织起来的呢?
下图讲述这些结构体之间的关系,其中配置解析到 http {
时创建的结构体指针,保存在上文图1中数组 conf_ctx
的元素下标 n
处。
结构体之间关系如下:
图5
往期文章