HTTP框架由核心模块ngx_http_module、两个HTTP模块ngx_http_core_module和ngx_http_upstream_module组成。整个HTTP框架调度其它HTTP模块来处理HTTP请求。HTTP框架的首要任务就是通过调用ngx_http_module_t接口管理所有HTTP模块的配置项。每一个HTTP模块ngx_module_t的ctx指针都必须指向一个ngx_http_module_t接口。例如ngx_http_core_module模块:
ngx_module_t ngx_http_core_module = {
NGX_MODULE_V1,
&ngx_http_core_module_ctx, /* module context */
ngx_http_core_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
其中包含了一个ngx_http_core_module_ctx接口,这个接口的定义如下:
static ngx_http_module_t ngx_http_core_module_ctx = {
ngx_http_core_preconfiguration, /* 解析http块配置项前回调 */
NULL, /* 解析完http块配置项后回调 */
ngx_http_core_create_main_conf, /* 创建用于存储位于http块内的配置项 */
ngx_http_core_init_main_conf, /* 解析完http内配置项后调用 */
ngx_http_core_create_srv_conf, /* 创建用于存储位于http配置块和server配置块内的配置项 */
ngx_http_core_merge_srv_conf, /* 将http块内同名的配置项合并到server块内 */
ngx_http_core_create_loc_conf, /* 创建用于存储位于http配置块、server配置块、location配置块内的配置项 */
ngx_http_core_merge_loc_conf /* 将其它两个块内同名配置项合并到location块内 */
};
可以看到,ngx_http_module_t接口完全是围绕配置项来进行的。一个块配置项对应一个结构体,块配置项的种类包括:
- http块配置项:整个HTTP业务都位于这个块内。
- server块配置项:每一个server{}块代表一个虚拟主机,由块内server_name确定主机名。
- location块配置项:如果匹配用户请求中的URI,那么就选择location{}块内的配置项来处理用户请求。
当以上三个块配置项中出现了相同名称的配置项时,以哪个配置块内的值为准由各个模块自由定义,甚至可以把两个配置项参数相加。
参考:
《深入理解Nginx》 P347-P351.