二、nginx服务启动过程



工作进程启动

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) {
            //主进程循环 具体逻辑后续补充
            }
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值