原创:https://blog.csdn.net/ndzjx/article/details/89222809
HTTP框架大致由1个核心模块(ngx_http_module)、两个HTTP模块(ngx_http_core_module、ngx_http_upstream_module)组成,它将负责调度其他HTTP模块来一起处理用户请求。首要任务是通过ngx_http_module_t接口中的方法来管理所有HTTP模块的配置项。
Server虚拟主机会以散列表的数据结构组织起来,高效查询。
Location表达式会以一个静态的二叉查找树组织起来。不使用红黑树,是因为location是从nginx.conf中读取到的,是静态不变的,不存在运行过程中添加删除的场景,而且红黑树的查询效率也没有重新构造的静态的完全平衡二叉树高。(ngx_http_init_locations/nginx_http_init_static_location_trees)
typedef struct {
ngx_int_t (*preconfiguration)(ngx_conf_t *cf);
ngx_int_t (*postconfiguration)(ngx_conf_t *cf);
void *(*create_main_conf)(ngx_conf_t *cf);
char *(*init_main_conf)(ngx_conf_t *cf, void *conf);
void *(*create_srv_conf)(ngx_conf_t *cf);
char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
void *(*create_loc_conf)(ngx_conf_t *cf);
char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;
1:处理http{}块内的main级别配置项时,对每个HTTP模块,都会调用create_main_conf、create_srv_conf、create_loc_conf建立3个结构体,这是为了把同时出现在http{},server{},location{}内的相同配置项进行合并而做的准备。
2:处理server{}内的srv级别配置项时,需要调用每个HTTP模块的create_srv_conf、create_loc_conf
3:处理location{}内的loc级别配置项时&