一. 基础
nginx的一般配置如下所示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30...
work_porcess: xx;
events{
...
work_connections xx;
}
http{
//第一级别的配置块
...
upstream xx{
//第二级别的配置块
...
}
server{
//第二级别的配置块
...
location /{
//第三级别的配置块
....
location /{
//第四级别的配置块
...
}
}
}
server{
//第二级别的配置块
...
}
}
- 如何存储上述结构?
- 由于配置中存在嵌套, 可以使用树型结构进行存储
- 如何使用上述配置?
- 从上到下, 按层查找
- 配置解析核心?
- 对于块中嵌套块的模块存储(例如http), 核心在于要以块为单位进行分析。例如, 最外层为http块, 属于一级配置; http中的server或者upstream属于二级配置块; server中的location属于三级配置块; 依次类推, 每块都看作一个完整的结构。
- 由于存在块中嵌套, 内层的块有些配置需要从外层块继承, 有些配置不能继承, 故而每块的配置需要按区域划分。
- 二级配置块需要放到一级配置块中, 这样才能从一级配置块中找到所有的二级配置块, 以此类推。
- 由于配置解析是依靠各个模块完成的, 故而配置存储的树形结构中需要以模块为单位存储(也就是每个模块具有自己的存储结构, 可以放在树形结构的某个位置上)。
二. nginx配置存储结构
由于结构比较复杂, 此处分为2部分。
- 第一部分配置存储结构图

- 图中只给出了http中的server配置, 没有画出server中的location以及location嵌套的location
- 第二部分配置存储结构图

三. http块存储结构
对于http的配置存储, 应当以块为单位进行分析,
- 总体而言, http块按树形存储
- 大体上可以分为3个级别(不考虑location中的location), 每个级别的配置分为3块(main块, srv块, loc块)
- 第二级别的配置继承第一级别的main块配置
- 第三级别的配置继承第二级别的main块以及srv块配置
- 第四及其后续级别的配置继承前一级的main块, srv块配置

四. nginx upstream块存储
- upstream的配置与server类似, 属于第二级别配置块
- upstream的配置块中main块从第一级别的main块继承

五. nginx proxy存储
- proxy_pass出现在location块中, 属于第三或者之后级别的配置。
