Nginx架构分析

Nginx采用master-worker架构,master进程管理worker进程,不直接处理请求;worker进程负责处理请求,数量默认等于CPU核心数,实现并发处理。当worker进程出错,master进程将重启新的worker。相比Apache,Nginx的worker进程能处理更多并发请求,且切换代价小。

1.整体架构

        Nginx最基本的就是master进程和worker进程,还有可能会有Cache相关进程。这些进程之间会相互通信。Nginx还有强大的功能模块:比如upstream与后端Web服务器通信、fastcgi与后端应用服务器通信等。完整的整体框架如图所示:

2.master进程

        Nginx的主进程充当master进程,而由master进程fork()出来的子进程则充当worker进程。

       master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程。当任意一个worker进程出项错误而意外退出时,master进程会立刻启动新的worker进程继续服务。

      Nginx的master进程的ngx_master_process_cycle()函数是主要的入口,该函数做完信号处理设置等之后就会调用一个名为ngx_start_worker_processes()的函数用于fork()产生出子进程。然后程序会进入一个for(;;)的无限循环中。在for(;;)循环中有一个关键的sigsuspend()函数调用,该函数会使得master进程阻塞在这里,直到收到信号为止。然后根据收到的信号而设置需要的处理。

void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{
    //信号处理设置等操作
    .......
    
    //产生worker工作进程
    ngx_start_worker_processes(cycle, ccf->worker_processes,
                               NGX_PROCESS_RESPAWN);
    ngx_start_cache_manager_processes(cycle, 0);

    ....

    for ( ;; ) 
    {
        .....
        
        //进程会阻塞在这里,直到收到信号为止
        sigsuspend(&set);

        ......
        
        //有子进程退出
        if (ngx_reap) {
            ngx_reap = 0;
            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");

            live = ngx_reap_children(cycle);
            if (!(live & NGX_PIPE_STILL_NEEDED) && close_old_pipe) {
                ngx_close_old_pipes();
                close_old_pipe = 0;
            }
        }

	
        if (!live && (ngx_terminate || ngx_quit)) 
        {
            ngx_master_process_exit(cycle);
        }

        //粗暴的结束Nginx
        if (ngx_terminate) 
        {
            .....
        }
        
        //优雅的结束Nginx
        if (ngx_quit) {
            
        }

        if (ngx_reconfigure) {
           ........
        }

        //重新启动Nginx
        if (ngx_restart) {
            ngx_restart = 0;
            ngx_start_worker_processes(cycle, ccf->worker_processes,
                                       NGX_PROCESS_RESPAWN);
            ngx_start_cache_manager_processes(cycle, 0);

#if (NGX_PROCS)
            ngx_procs_start(cycle, 0);
#endif

            live = 1;
        }
        
        .......
    }
}

 

3.worker进程

        多个worker进程处理互联网请求可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是可以充分利用多核架构,实现微观上真正的多核并发处理。Nginx默认设置的worker进程数和CPU核心数量一致。与Apache的比较:

        在Apache上每个进程在一个时刻只处理一个请求,因此如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程设置的更多,通常会达到一台服务器上拥有几百个工作进程,这样大量的进程间切换将带来大量的系统资源消耗。

     而Nginx一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制。因此,当Nginx上的worker进程数与CPU核心数相等时,进程切换的代价最小。

        worker进程的主要执行函数ngx_worker_process_cycle()函数,该函数主体也是一个无限for(;;)循环,持续不断的处理客户端的服务请求。worker进程的主要工作就是与客户端或后端真实服务器之间的数据的I/O交互事件,所以worker进程阻塞点在select()、epoll_wait()等这样的I/O多路复用函数调用上。

static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
    ....

    for ( ;; ) {

        if (ngx_exiting) 
        {
	    .....
        }

	....
	//该函数会调用事件监控函数,如epoll_wait()
        ngx_process_events_and_timers(cycle);

        if (ngx_terminate) 
        {
      	    .....
        }

        if (ngx_quit) 
        {
            ....
        }

        if (ngx_reopen)
        {
            ....
        }
    }
}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值