几个重要的指令类型属性
我们知道,每一个Nginx的模块就是对应一个ngx_module_t类型的结构体,该结构体的commands成员是一个数组,里面包括了该模块的配置指令。每一个commands成员是ngx_command_t类型的结构体,其定义如下:
struct ngx_command_s {
ngx_str_t name;
ngx_uint_t type;
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
};
我们重点关注这个type成员。有如下几个比较重要的type属性需要着重熟悉:
-
NGX_MAIN_CONF
-
NGX_DIRECT_CONF
-
NGX_CONF_BLOCK
搜索一下nginx-1.6.2的源代码,发现,type值包含了NGX_DIRECT_CONF的指令所在的模块分别是:
-
ngx_core_module模块的所有指令。
-
ngx_openssl_module模块的所有指令。其实只有一个ssl_engine
-
ngx_google_perftools_module模块的所有指令。其实只有一个google_perftools_profiles
-
ngx_regex_module模块的所有指令。其实只有一个pcre_jit
这几个模块有如下共同点:
-
模块类型都是NGX_CORE_MODULE
-
指令类型NGX_DIRECT_CONF都是与NGX_MAIN_CONF共同出现
在Nginx中的几个基本模块和几个模块ctx类型中,我们讲过,Nginx-1.6.2中,ngx_core_module_t类型的模块(即ctx成员为ngx_core_module_t类型的ngx_module_t变量,也即type成员为NGX_CORE_MODULE的ngx_module_t变量)包括:
-
ngx_core_module
-
ngx_events_module
-
ngx_openssl_module
-
ngx_google_perftools_module
-
ngx_http_module
-
ngx_errlog_module
-
ngx_mail_module
-
ngx_regex_module
这些NGX_CORE_MODULE类型的模块中,还有如下几个,其配置指令集中没有NGX_DIRECT_CONF类型的指令:
-
ngx_events_module
-
ngx_http_module
-
ngx_errlog_module
-
ngx_mail_module
其中:
-
ngx_events_module模块只有一个指令"events",是一个配置块类型的指令,即指令类型包含NGX_CONF_BLOCK.
-
ngx_http_module模块只有一个指令"http",同样是一个配置块类型的指令,即指令类型包含NGX_CONF_BLOCK.
-
ngx_errlog_module
-
ngx_mail_module模块有两个指令“mail”和“imap”,且都是配置块类型的指令,即指令类型包括NGX_CONF_BLOCK.
搜索nginx-1.6.2代码,发现type值包含了NGX_MAIN_CONF的指令所在的模块 为:
-
ngx_core_module模块的所有指令。
-
ngx_events_module模块的所有指令。其实只有一个“events”
-
ngx_openssl_module模块的所有指令。其实只有一个“ssl_engine”
-
ngx_google_perftools_module模块的所有指令。其实只有一个"google_perftools_profiles"
-
ngx_http_module模块的所有指令,其实只有一个"http".
-
ngx_errlog_module模块的所有指令,其实只有一个"error_log"
-
ngx_mail_module模块的所有指令,包含"mail"和"imap"
-
ngx_regex_module模块的所有指令,包含"pcre_jit"
这几个模块有如下共同点:
所以,综上,在nginx-1.6.2中,关于NGX_MAIN_CONF和NGX_DIRECT_CONF有如下几点:
-
NGX_MAIN_CONF和NGX_DIRECT_CONF都只会出现在NGX_CORE_MODULE类型的模块中。
-
所有的NGX_CORE_MODULE类型的模块,其指令均有NGX_MAIN_CONF属性
-
所有NGX_CORE_MODULE类型的模块,除了ngx_errlog_module模块外,其指令如果没有NGX_DIRECT_CONF属性,则会有NGX_CONF_BLOCK属性。ngx_errlog_module模块比较特殊,其指令属性为“NGX_MAIN_CONF|NGX_CONF_1MORE”
-
所有的nginx模块中,NGX_DIRECT_CONF和NGX_CONF_BLOCK属性不会同时出现。
另外,type值包含了NGX_CONF_BLOCK属性的指令所在的模块有:
-
ngx_events_module模块,指令只有“events”
-
ngx_http_module模块,指令只有“http”
-
ngx_http_charset_filter_module模块的“charset_map”指令
-
ngx_http_core_module模块的server指令、location指令、types指令、limit_except指令
-
ngx_http_geo_module模块的geo指令
-
ngx_http_map_module模块的map指令
-
ngx_http_rewrite_module模块的if指令
-
ngx_http_split_clients_module模块的split_clients指令
-
ngx_http_upstream_module模块的upstream指令
-
ngx_mail_module模块的mail指令和imap指令
-
ngx_mail_core_module模块的server指令
列出这些不是为了去死记硬背。而是我们可以很直观的了解到,NGX_CONF_BLOCK属性只能表示该命令后面跟的是一个复杂配置项而已。
Nginx配置解析的流程
Nginx配置解析的流程如下图所示:
(责任编辑:IT) |