<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先看Nginx的主进程,主进程从main函数开始运行:
</span>
int ngx_cdecl main(int argc, char *const *argv)
{
ngx_int_t i;
ngx_log_t *log;
ngx_cycle_t *cycle, init_cycle;
ngx_core_conf_t *ccf;
ngx_max_sockets = -1;
// 初始化时钟模块,更新时钟(详见ngx_time_update)
ngx_time_init();
// 获取进程号
ngx_pid = ngx_getpid();
// 初始化日志
log = ngx_log_init();
if (log == NULL) { return 1;}
// 初始化Openssl
ngx_ssl_init(log);
ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
init_cycle.log = log;
ngx_cycle = &init_cycle;
// 创建内存池
init_cycle.pool = ngx_create_pool(1024, log);
if (init_cycle.pool == NULL) { return 1; }
// 保存argc和argv到ngx_argc和ngx_argv中
if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) { return 1; }
// 解析argv中的参数,部分作用于init_cycle
if (ngx_getopt(&init_cycle, argc, ngx_argv) != NGX_OK) { return 1; }
// 这里的ngx_show_version、ngx_show_configure和ngx_test_config都是由ngx_getopt确定的
if (ngx_show_version) {
ngx_write_fd(ngx_stderr_fileno, "nginx version: " NGINX_VER CRLF,
sizeof("nginx version: " NGINX_VER CRLF) - 1);
if (ngx_show_configure) { …… }
if (!ngx_test_config) { return 0; }
}
if (ngx_test_config) {
log->log_level = NGX_LOG_INFO;
}
// 获取系统相关参数,例如pagesize和cpu个数;初始化随机种子
if (ngx_os_init(log) != NGX_OK) { return 1; }
if (ngx_crc32_init() != NGX_OK) { return 1; }
// 如果获得了环境变量,就会初始化cycle. Listening,否则直接返回
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { return 1; }
ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) {
ngx_modules[i]->index = ngx_max_module++;
}
// 超级大的一个函数
cycle = ngx_init_cycle(&init_cycle);
if (cycle == NULL) {
if (ngx_test_config) {
ngx_log_error(NGX_LOG_EMERG, log, 0,
"the configuration file %s test failed",
init_cycle.conf_file.data);
}
return 1;
}
if (ngx_test_config) {
ngx_log_error(NGX_LOG_INFO, log, 0,
"the configuration file %s was tested successfully",
cycle->conf_file.data);
return 0;
}
// 打印日志
ngx_os_status(cycle->log);
ngx_cycle = cycle;
// 宏展开为ccf = cycle->conf_ctx[ngx_core_module.index];
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
// ccf->master在ngx_core_module_init_conf中被设置为1
ngx_process = ccf->master ? NGX_PROCESS_MASTER : NGX_PROCESS_SINGLE;
// 设置软中断(信号)处理函数ngx_signal_handler,该函数完成了对11种信号的处理
if (ngx_init_signals(cycle->log) != NGX_OK) { return 1; }
if (!ngx_inherited && ccf->daemon) {
if (ngx_daemon(cycle->log) != NGX_OK) {
return 1;
}
ngx_daemonized = 1;
}
// 创建进程记录文件
if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {
return 1;
}
if (ngx_process == NGX_PROCESS_MASTER) {
ngx_master_process_cycle(cycle);
} else {
ngx_single_process_cycle(cycle);
}
return 0;
}
main函数主要完成一系列初始化(详见注释),然后进入进程循环函数。根据输入参数的设置,可以进入主进程循环(ngx_master_process_cycle)或者单进程循环(ngx_single_process_cycle)。一般都是进入主进程循环。在该模式下,主进程会启动若干个(等于CPU核心数)工作进程用以完成相关计算。
下面是主进程真正进入主循环之前所做的工作:
void ngx_master_process_cycle(ngx_cycle_t *cycle)
{
char