开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
main 函数工作主体
- ngx_int_t ngx_strerror_init(void); // 初始化nginx中定义的错误,初始化 ngx_sys_errlist.
- ngx_sys_errlist: 是一个ngx_str_t 结构体数组,每一个 ngx_str_t 中存储了错误的信息,例如:ngx 1 号错误可以通过 ngx_sys_errlist[1] 来获取具体的错误信息
- static ngx_int_t ngx_get_options(int argc, char *const *argv); // 解析 nginx 后面跟的命令参数,例如:nginx -v
其主要实现过程是:遍历每一个参数,并用switch case去解析参数中的具体内容
static ngx_int_t
ngx_get_options(int argc, char *const *argv)
{
u_char *p;
ngx_int_t i;
for (i = 1; i < argc; i++) { // 解析所有的参数
p = (u_char *) argv[i]; //
if (*p++ != '-') {
ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);
return NGX_ERROR;
}
while (*p) {
switch (*p++) {
case '?':
case 'h':
ngx_show_version = 1;
ngx_show_help = 1;
break;
}
}
}
}
-
void ngx_time_init(void);// 初始化 nginx 运行时间
-
ngx_log_t *ngx_log_init(u_char *prefix); // 初始化日志
主进程启动的时候,此时还没有读取配置文件,即没有指定日志打印在哪里。nginx这时候虽然可以将一些出错内容或者结果输到标准输出,但是如果要记录一些系统初始化情况,
socket监听状况,还是需要写到日志文件中去的。在nginx的main函数中,首先会调用ngx_log_init 函数,默认日志文件为:安装路径/logs/error.log,如果这个文件没有权限访问的话,
会直接报错退出。在mian函数结尾处,在ngx_master_process_cycle函数调用之前,会close掉这个日志文件。
- static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv); 保存参数
- static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 调用ngx_process_options()初始化ngx_cycle的prefix, conf_prefix, conf_file, conf_param等字段;
- ngx_int_t ngx_os_init(ngx_log_t *log) //调用ngx_os_init()初始化系统相关变量
- 获取内存页面大小ngx_pagesize,
- 根据 cpu 型号设置 cpu 缓存行, 通过 ngx_cpuinfo 函数获取 cpu 型号
- 获取每个进程可以打开的最大文件描述符的数目。
-
ngx_int_t ngx_crc32_table_init(void); //调用ngx_crc32_table_init()初始化CRC表(后续的CRC校验通过查表进行,效率高);
-
static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle); // nginx 进行平滑升级的时候会继承旧 nginx 中的sockets
- nginx 通过 get_env 函数获取环境变量来判断是否需要进行平滑升级, 当执行一些动作的时候 nginx 中旧master进程bind监听的fd写入到环境变量NGINX_VAR中
- ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle); 初始化cycle 结构体
cycle 是 nginx 的核心控制
-
nginx 设置最初的进程为 master 进程
-
ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log) // 创建 pid 文件
这些文件保存了进程的 pid,在后面nginx进程升级的时候会用到
-
ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle); // 把cycle->log fd设置为STDERR_FILENO
-
nginx 以单进程或这多进程的方式运行