Hello!
2013/9/28 吴健:
> 最近在学习Nginx,遇到一些不明白的问题,向你请教一下。
> 1.为什么需要create_main_conf create_srv_conf
> create_loc_conf三个方法?他们的作用不都是返回一个配置结构体的对象(我理解为三个不同的对象)吗,还是说对应于main
> server和location三个级别的配置项是定义三个不同的配置结构体来存储的(定义三个配置结构体,分别存储main
> server和location级别的配置项)?
main conf 是指只对全局有意义的配置,*最低*只能在 http {} 配置块中使用的指令。srv conf 是指只对 server
级别有意义的配置,即*最低*只能在 server {} 配置块中使用的指令。loc conf 是指只对 location
有意义的配置,即最低只能在 location {} 块或者 if {} 块中使用的配置。这种区分只是规定了他们最终生效的*最小粒度*。
因此,在 server {} 块中使用的 location conf 最终还是要逐层 merge 到各个更低层面上的 location {}
块中才会被使用。这也意味着,如果当前处理的请求尚未和任何 location 相关联的时候(即早于 nginx 的“find
config请求处理阶段的时候),你的模块是不能访问任何 location conf 信息的,你只能获取 main conf (以及 srv
conf,如果当前请求已经和某个 server {} 相关联了)。
> 如果是定义三个不同的结构体还能理解,但是如果对于一个模块只定义一个配置结构体,然后把模块中的所有指令都放进去的话,我就不太明白了。
nginx 模块根据自己的实际需要来取舍。建议你仔细查看真实世界里的 nginx 模块的源码实现,这样便很容易明确这里的设计意图,而不用再猜测了。
> 2.在设定配置项的解析方式,也就是定义每个配置项的ngx_command_s时,有一个参数是ngx_uint_t
> conf,书上解释说该参数是用于确定由哪个方法返回的配置结构体来存储这个配置项。
ngx_command_t 的 ngx_uint_t conf 字段本质上是一个偏移量,语义上决定着当前定义的配置指令对应的是 main
conf, srv conf 还是 loc conf. 三种类型一般对应三种不同的 C
结构体。它们是互斥的。注意,这与配置指令允许的作用域无关,只规定了配置指令允许的*最小*作用域。
> 那对于一个同时出现在main、sever和loc级别的配置项来说,是怎么处理呢?后面既然需要合并同名配置项,那应该在三个对象里都存储这个配置项啊。
>
这个不相干。如果一个配置指令可以同时出现在 main, server 和 location 级别,则它的最小使用粒度便是
location,所以你必然会使用 loc conf,而不是其他两种类型。
同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty
建议你也加入此列表并总是在那里讨论这样的问题。谢谢合作!
Best regards,
-agentzh