1、ngx_debug_init();
初始化debug函数,一般为空。
2、ngx_strerror_init();
将系统错误码+错误信息,以ngx_str_t数组保存。
3、ngx_get_options(int argc, char *const *argv)
nginx启动函数选项,
4、ngx_show_version_info();
如果上一步启动nginx输入量v选项,则显示nginx版本信息,
5、ngx_time_init();
初始化nginx系统时间。
如下
1 void 2 ngx_time_init(void) 3 { 4 ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1; 5 ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; 6 ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; 7 ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1; 8 ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1; 9 10 ngx_cached_time = &cached_time[0]; 11 12 ngx_time_update(); 13 }
6.ngx_pid = ngx_getpid();
获取进程id,在进程文件process.c中,
#define ngx_getpid getpid
7、ngx_log_init(ngx_prefix);
初始化nginx日志,打开日志文件。ngx_prefix为文件路径,由nginx -p选项确定
nginx日志结构体如下
1 struct ngx_log_s { 2 ngx_uint_t log_level; 3 ngx_open_file_t *file; 4 5 ngx_atomic_uint_t connection; 6 7 time_t disk_full_time; 8 9 ngx_log_handler_pt handler; 10 void *data; 11 12 ngx_log_writer_pt writer; 13 void *wdata; 14 15 /* 16 * we declare "action" as "char *" because the actions are usually 17 * the static strings and in the "u_char *" case we have to override 18 * their types all the time 19 */ 20 21 char *action; 22 23 ngx_log_t *next; 24 };
8.ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));初始化全局cycle
1 ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); 2 //初始化init_cycle的log 3 init_cycle.log = log; 4 ngx_cycle = &init_cycle; 5 //给init_cycle创建内存池 6 init_cycle.pool = ngx_create_pool(1024, log);
内存池结构入口
9、ngx_save_argv(&init_cycle, argc, argv)
保存启动参数,通过alloc函数分配空间。
10、ngx_process_options(&init_cycle)
将路径及配置路径写入cycle中
1 cycle->conf_prefix.len = len; 2 cycle->conf_prefix.data = p; 3 cycle->prefix.len = len; 4 cycle->prefix.data = p;
11、ngx_os_init(log) ngx_crc32_table_init()不懂
系统初始化
12、ngx_add_inherited_sockets(&init_cycle)
这个是重启时继承监听端口。不懂
13、ngx_preinit_modules()
初始化模块,index及name
1 ngx_int_t 2 ngx_preinit_modules(void) 3 { 4 ngx_uint_t i; 5 6 for (i = 0; ngx_modules[i]; i++) { 7 ngx_modules[i]->index = i; 8 ngx_modules[i]->name = ngx_module_names[i]; 9 } 10 11 ngx_modules_n = i; 12 ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES; 13 14 return NGX_OK; 15 }
14、ngx_init_cycle(&init_cycle)
这个函数做的事情比较多,开始先把原来init_cycle里的原始数据进行拷贝
然后创建并解析了核心模块的配置。这个单列出来说吧。
15.ngx_signal_process(cycle, ngx_signal);
如果ngx_signal模式启动nginx的话,nginx的启动准备工作到此就已经结束了
此步,采用非master-workers的启动模式,单进程启动nginx。
16.ngx_os_status(cycle->log);
17.ngx_init_signals(cycle->log);
18.ngx_create_pidfile(&ccf->pid, cycle->log);
19.ngx_master_process_cycle(cycle);
准备工作就绪,这里master就开始真正工作了。单列出来说下。