直接跟代码 :
main ->
ngx_preinit_modules(对模块名进行复制) ->
ngx_init_cycle(讲模块对象复制到cycle里面) -> ngx_cycle_modules
ngx_master_process_cycle ->
ngx_start_worker_processes ->
ngx_worker_process_cycle ->
ngx_worker_process_init ->
cycle->modules[i]->init_process(cycle) (每个work进程中初始化这些模块)
1、ngx_preinit_modules
初始化所有模块,并对模块进行编号
ngx_int_ ngx_preinit_modules(void)
{
ngx_uint_t i;
for (i = 0; ngx_modules[i]; i++) {
ngx_modules[i]->index = i;
ngx_modules[i]->name =
ngx_module_names[i]; //见下面
ngx_module_names分析
}
ngx_modules_n = i;
ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES;
return NGX_OK;
}
ngx_module_names分析 :
定义在ngx_module.h中
extern char *ngx_module_names[]; //一个外部定义
生成原理 :
1. 具体的模块
可通过编译前的
configure
命令进行配置,即设置哪些模块需要编译,哪些不被编译
。
当编译的时候,会生成ngx_modules.c的文件,里面就包含模块数组。
2. 新增模块或者减少模块可以在configure命令执行前 auto/modules文件里面修改。
生成的objs/ngx_modules.c文件如下:
#include
#include
extern ngx_module_t ngx_core_module;
extern ngx_module_t ngx_errlog_module;
extern ngx_module_t ngx_conf_module;
extern ngx_module_t ngx_events_module;
extern ngx_module_t ngx_event_core_module;
extern ngx_module_t ngx_epoll_module;
extern ngx_module_t ngx_http_module;
......
ngx_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
&ngx_openssl_module,
&ngx_regex_module,
&ngx_events_module,
&ngx_event_core_module,
&ngx_epoll_module,
.....
}
char *ngx_module_names[] = {
"ngx_core_module",
"ngx_errlog_module",
"ngx_conf_module",
"ngx_openssl_module",
"ngx_regex_module",
"ngx_events_module",1
"ngx_event_core_module",
"ngx_epoll_module",
"ngx_http_modul
.....
}
2、
ngx_init_cycle(讲模块对象复制到cycle里面) -> ngx_cycle_modules
初始化cycle,并初始化模块
ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle)
{
/*
* create a list of modules to be used for this cycle,
* copy static modules to it
*/
cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)
* sizeof(ngx_module_t *));
if (cycle->modules == NULL) {
return NGX_ERROR;
}
//在work进程初始化中, 会调用
cycle->modules模块的初始化函数
ngx_memcpy(cycle->modules, ngx_modules,
ngx_modules_n * sizeof(ngx_module_t *));
cycle->modules_n = ngx_modules_n;
return NGX_OK;
}
3、work进程中init_process模块
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
{
.......
for (i = 0; cycle->modules[i]; i++) {
if (cycle->modules[i]->init_process) {
if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {
/* fatal */
exit(2);
}
}
}
}