vlambda博客
学习文章列表

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 指令官方说明如下:

Nginx配置指令内存布局示例

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;
        }
    }
}

内存布局如下:

Nginx配置指令内存布局示例

图2

由内存布局可知,转发给上游服务器的请求头域中仅包含 Test3: c

配置示例2

配置文件内容:

http{
    proxy_set_header Test1 "a";

    server {
        proxy_set_header Test2 "b";
        location {
            # 注意这里 location 级别未配置
            proxy_pass: https://www.baidu.com;
        }
    }
}

内存布局如下:

Nginx配置指令内存布局示例

图3

由内存布局可知,转发给上游服务器的请求头域中仅包含 Test2: b

配置示例3

配置文件内容:

http{
    proxy_set_header Test1 "a";

    server {
        # 注意这里 server 级别未配置
        location {
            # 注意这里 location 级别未配置
            proxy_pass: https://www.baidu.com;
        }
    }
}

内存布局如下:

Nginx配置指令内存布局示例

图4

由内存布局可知,转发给上游服务器的请求头域中仅包含 Test1: a

配置结构体关系

从以上示例可以看出,nginx 配置文件中每一个 serverlocation 都对应一个结构体 ngx_http_conf_ctx_t,那这些结构体是如何组织起来的呢?
下图讲述这些结构体之间的关系,其中配置解析到
http {  时创建的结构体指针,保存在上文图1中数组 conf_ctx 的元素下标 n 处。
结构体之间关系如下:

图5


往期文章