《深入理解nginx》中是用流程图+文字的形式讲解了nginx的启动框架处理流程(Page 275),我是结合源码对应着教材过了一篇nginx的启动流程,记录如下:
一.源码位置
main函数:nginx\src\core\nginx.c
ngx_init_cycle函数:nginx\src\core\Ngx_cycle.c
二.启动处理流程
1.解析命令行,处理参数
if (ngx_get_options(argc, argv) != NGX_OK) {
return 1;
}
if (ngx_show_version) {
ngx_show_version_info();
if (!ngx_test_config) {
return 0;
}
}
/* TODO */ ngx_max_sockets = -1;
ngx_time_init();
....
if (ngx_process_options(&init_cycle) != NGX_OK) {
return 1;
}
if (ngx_os_init(log) != NGX_OK) {
return 1;
}
/*
* ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()
*/
if (ngx_crc32_table_init() != NGX_OK) {
return 1;
}
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
return 1;
}
if (ngx_preinit_modules() != NGX_OK) {
return 1;
}
以上程序对应于《深入理解nginx》page 276图中的1,2两个步骤。
2.调用ngx_init_cycle方法初始化ngx_cycle_t结构体
cycle = ngx_init_cycle(&init_cycle);
if (cycle == NULL) {
if (ngx_test_config) {
ngx_log_stderr(0, "configuration file %s test failed",
init_cycle.conf_file.data);
}
return 1;
}
ngx_init_cycle函数完成了配置项解析等很多的事情,具体参见《深入理解nginx》
3.根据配置情况,以不同的方式运行nginx
if (ngx_process == NGX_PROCESS_SINGLE) {
ngx_single_process_cycle(cycle);
} else {
ngx_master_process_cycle(cycle);
}
注:阅读源码的过程中可以参考 https://github.com/y123456yz/reading-code-of-nginx-1.9.2 这个有注释的nginx工程来学习