五、配置文件为何存在
是先有项目代码,还是先有配置文件呢?我觉得,配置文件是因项目代码存在而存在的,这样讲似乎有点空白。
项目之初,代码是可以硬编码的,比如实现守护进程。但是呢?这样缺少灵活性,所以用配置文件里的配置选项控制这个行为,也正因为如此,配置选项一定要依附,挂钩于某个模块,然后它的值应该解析到这个模块携带的配置结构体。
现在还是单一的行为,由核心行为引起的。但是到了用户决定行为的时候,配置文件应该出现分支。你想到server, location了吗,不同的server有不同的配置,这也是虚拟主机的实现机制。
这个分支非常的重要,原来的ngx_cycle有个void ****conf_ctx;很酷吧,4层指针。获取配置是这样的:
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
其中,ngx_get_conf这样预定义:
#define ngx_get_conf(conf_ctx, module) conf_ctx[module.index]
但是到了分支这里,从cycle->conf_ctx变成了r
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
ngx_http_get_module_main_conf这样定义:
#define ngx_http_get_module_main_conf(r, module) \
(r)->main_conf[module.ctx_index]
当分析完用户的请求行为后,又会将分析完的配置定下来,比如虚拟主机如何实现的:
ngx_http_find_virtual_server(r, r->headers_in.server.data, r->headers_in.server.len) {
cscf = ngx_hash_find_combined(&r->virtual_names->names,
ngx_hash_key(host, len), host, len);
if (cscf) {
r->srv_conf = cscf->ctx->srv_conf; // 以后直接找r要src_conf获取。
r->loc_conf = cscf->ctx->loc_conf;
}
}
天空行空的一口气写完,本文结束!