Hello!
2013/9/29 吴健:
> 谢谢你的耐心解答,因为是初学者,我仍然有些不理解的地方。
我也是从初学者过来的,我最主要的经验就是阅读源码,特别是各种 nginx 标准模块和第三方模块的实现。显然,相比我 2009 年初学
nginx 的时候,现在有更多更高质量的第三方模块可供参考,这无疑是一大幸事。所以,在此我再次重复一下我的这一个建议。
我觉得如果你稍微 grep 一下 nginx 的源码也不至于有这种困惑。我也会觉得我回答问题的时间得到了更好的使用。
> 1.在解析http{}配置块时,create_main_conf,create_srv_conf和create_loc_conf三个方法返回的到底是同一配置结构体的三个对象(三个级别出现的所有配置项在一个结构体里定义)还是三个不同结构体的对象(三个级别配置项分别对应三个不同的配置结构体)?
它们通常对应不同的 struct 类型。比如 ngx_lua 模块中就分别定义了 ngx_http_lua_loc_conf_t 和
ngx_http_lua_main_conf_t 这两个完全不同的 struct 类型,见
https://github.com/chaoslawful/lua-nginx-module/blob/master/src/ngx_http_lua_common.h
> 你说“nginx
> 模块根据自己的实际需要来取舍”,是不是说可以把所有配置项都定义在一个结构体里也可以把main
> server和location级别的配置项分别定义在三个不同 的结构体里(这里指结构体的定义,不是对象)?
是三种不同的 struct 类型,不是同一种 struct 类型分配出来的三个内存实例。
> 2.你说”ngx_command_t 的 ngx_uint_t conf 字段本质上是一个偏移量,语义上决定着当前定义的配置指令对应的是 main
> conf, srv conf 还是 loc conf.“ 如果一个配置指令在main
> sever和loc级别都出现了,定义该指令的ngx_command_t的时候,conf字段设置成了NGX_HTTP_MAIIN_CONF_OFFSET,也就是设置为写入create_main_conf创建的结构体对象中,那这个指令在server和location级别的定义就失去意义了(因为只会将main级别的写入对象中存储,server和loc级别的配置块因为没有定义create_main_conf就不会起作用了)?
>
我不是说了,main conf 的最小适用粒度就是 http {} 配置块,你为何一定要在 server {} 和 location {}
配置块中使用呢?在 C 级别上工作最好按作者的设计意图来使用,否则后果是“未定义的”。
继续抄送给 openresty 中文邮件列表。
Regards,
-agentzh