Bootstrap

Nginx进程分析(master_process篇)

<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   
;