。
。
。
工作进程启动
nginx分为单进程模式和master-worker多进程模式
if (ngx_process == NGX_PROCESS_SINGLE) {
//单进程模式
ngx_single_process_cycle(cycle);
} else {
//多进程模式
ngx_master_process_cycle(cycle);
}
多进程模式中
ngx_master_process_cycle函数
1、信号集挂起 sigemptyset 为了防止程序因为这些信号到来导致中断
2、重置进程名称 ngx_setproctitle 修改进程名称也就是修改argv所指向的内存地址的内容,由于argv[n]整块内存是连续的,修改起来并不是那么容易。
3、启动worker进程 ngx_start_worker_processes
static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{
ngx_int_t i;
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");
for (i = 0; i < n; i++) {
ngx_spawn_process(cycle, ngx_worker_process_cycle,
(void *) (intptr_t) i, "worker process", type);
ngx_pass_open_channel(cycle);
}
}
代码根据配置的进程数 来创建子进程,子进程在ngx_spawn_process中创建。下边是ngx_spawn_process部分代码。
pid = fork();
switch (pid) {
case -1:
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"fork() failed while spawning \"%s\"", name);
ngx_close_channel(ngx_processes[s].channel, cycle->log);
return NGX_INVALID_PID;
case 0:
ngx_parent = ngx_pid;
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
default:
break;
}
可以看出子进程在fork出来以后会进入proc(cycle,data)。这个函数是外部传进来的回调函数。子进程进入这个函数后就会不断轮训处理各种事件。主进程返回。
4、ngx_start_cache_manager_processes 缓存管理进程
创建完工作进程后nginx会以同样的方式创建缓存管理进程。
5、主进程进入循环
for ( ;; ) {
if (delay) {
if (ngx_sigalrm) {
//主进程循环 具体逻辑后续补充
}
}
}