启动流程(二)
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
return 1;
}
识别NGINX_VAR环境变量,并且初始化&cycle->listening添加socket fd,并且重新设置ngx_listening_t中的字段。
if (ngx_preinit_modules() != NGX_OK) {
return 1;
}
./src/core/ngx_module.c
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;
}
./src/core/ngx_cycle.c
if (ngx_test_config) {
if (!ngx_quiet_mode) {
ngx_log_stderr(0, "configuration file %s test is successful",
cycle->conf_file.data);
}
if (ngx_dump_config) {
cd = cycle->config_dump.elts;
for (i = 0; i < cycle->config_dump.nelts; i++) {
ngx_write_stdout("# configuration file ");
(void) ngx_write_fd(ngx_stdout, cd[i].name.data,
cd[i].name.len);
ngx_write_stdout(":" NGX_LINEFEED);
b = cd[i].buffer;
(void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos);
ngx_write_stdout(NGX_LINEFEED);
}
}
return 0;
}
打印配置文件信息。
if (ngx_signal) {
return ngx_signal_process(cycle, ngx_signal);
}
./src/core/ngx_cycle.c
./nginx -s reload
根据指令完成对nginx的操作,并且完成该进程。这个进程会向正在运行的nginx master进程发送对应的信号。
ngx_os_status(cycle->log);
在logs/error.log 日志文件里面写入状态日志
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {
ngx_process = NGX_PROCESS_MASTER;
}
获取ngx_core_module模块配置,一般情况下ngx_process初始化的时候就是NGX_PROCESS_SINGLE,配置默认模式是master模式,所以ccf->master为true,ngx_process会被设置为NGX_PROCESS_MASTER;如果设置nginx.conf中的配置文件加入
master_process off
结束掉之前启动的nginx进程,然后重新启动,就会发现只有一个进程,原来的worker进程没有了
if (ngx_init_signals(cycle->log) != NGX_OK) {
return 1;
}
./src/os/unix/ngx_process.c
if (!ngx_inherited && ccf->daemon) {
if (ngx_daemon(cycle->log) != NGX_OK) {
return 1;
}
ngx_daemonized = 1;
}
if (ngx_inherited) {
ngx_daemonized = 1;
}
实现进程守护。
if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {
return 1;
}
./src/core/ngx_cycle.c
if (ngx_log_redirect_stderr(cycle) != NGX_OK) {
return 1;
}
./src/core/ngx_log.c
if (ngx_process == NGX_PROCESS_SINGLE) {
ngx_single_process_cycle(cycle);
} else {
ngx_master_process_cycle(cycle);
}
return 0;
最后判断是master_process的模式,根据不同不是执行ngx_single_process_cycle或者是ngx_master_process_cycle,然后结束进程。