Nginx源码分析 ——Nginx的进程模型


一、Nginx的功能简介

Nginx ("EngineX"),一个业界使用率非常高的轻量级高性能 HTTP 和反向代理服务器,也提供IMAP/POP3/SMTP等代理服务器功能。

近年,由于Nginx专业团队不断提升其稳定性和各项服务性能指标,在很多方面已经超越著名的Apache服务器。由于Nginx是开源的,国内使用它作为Web 服务器的网站也越来越多,其中包括新浪博客、新浪播客、网易新闻等门户网站频道,六间房、56.com等视频分享网站,Discuz!官方论坛、水木社区等知名论坛,豆瓣、YUPOO相册、海内SNS、迅雷在线等新兴Web 2.0网站。同时,Nginx在我大京东的各种服务和应用中也占据着不可替代的地位。

本文简单介绍一下Nginx的进程模型,本系列文章分析的Nginx源码版本为v1.9.11。

二、Nginx的进程模型

Nginx通常使用的模式有两种:NGX_PROCESS_SINGLE(单进程模式)和NGX_PROCESS_MASTER (Master-Worker多进程模式)。由于SINGLE模式仅用于开发和测试,而实际有效使用的都是Master-Worker模式,所以我们这里讨论Master-Worker模式。如下图所示,Nginx启动之后,会有几个Nginx进程,一个Master进程、两个Cache进程、以及多个Worker进程,每个进程都默默地完成自己的工作,同时也为其他进行提供协作。另外,除了自身进程间通信之外,Nginx还通过其强大的功能模块与其他应用进行配合使用,例如通过upstream模块与后端Web服务器通信,通过fastcgi模块与后端应用服务器通信,通过MemCache和缓存服务器通信。

Nginx的进程模型和通常的后台服务程序采用了相同的模式,即按职责分为监控进程和工作进程两类。监控进程又是主进程,其负责启动Nginx,通过fork()创建工作进程;工作进程则监听来自客户端的请求,并进行下一步的处理。另外,监控进程还负责整个进程组和管理者之间的交互,以及监管工作进程的生命状态。


1、核心进程模型—监控进程

Master-Worker模式的入口是main()->ngx_master_process_cycle(),在该函数中,主进程做完信号量设置之后,便通过ngx_start_worker_processes()创建工作进程,通过ngx_start_cache_manager_processes()创建Cache进行。这两个函数都会使用fork()创建相应的子进行,并进入各自的核心主循环,进行for(;;)不断处理客户端请求或者其他事件,直到退出。下图是核心进程的创建过程及相应的进程状态机。

由于Master进程的主要职责是处理管理者交互,所有它主要是通过信号量驱动。在它的for(;;)中调用了sigsuspend()将自己挂起,直到收到信号量则处理相应的信号量事件。这里Master进程需要处理的事件主要包括ngx_reap(有子进程退出),ngx_terminate/ ngx_quit(Nginx需要退出,terminate通过旗标直接退出并给子进程发送NGX_TERMINATE_SIGNAL信号,而quit则做完相关清理工作,并给所有子进程发送NGX_SHUTDOWN_SIGNAL信号,等所有的子进程结束之后再退出),ngx_reconfigure(重新加载配置), ngx_restart(重启Worker进程和Cache进程), ngx_reopen(重新打开Worker进程佂听的端口),ngx_change_binary(重新load Nginx的二进制文件), 以及ngx_noaccept(关闭Worker进程佂听的端口)等操作。


代码片段如下:

ngx_master_process_cycle(){

//设置信号量

ngx_start_worker_processes();

ngx_start_cache_manager_processes();

for(;;){

         sigsuspend(&set);

         if(ngx_reap){}

         ….

         if(ngx_noaccept){}

}

}

2、核心进程模型—工作进程

Worker进程的职责是完成与客户端以及后端服务器之间的通信,则它关注的端口上的数据可读/可写等I/O交互事件,因而Worker进程的阻塞点应该是select(), epoll_wait()这样的I/O多路复用函数处,以等待发生数据的读写事件,另外,它也可以被信号量中断。

代码片段如下:

ngx_worker_process_cycle(){

                   ngx_worker_process_init();

                   for(;;){

                            if (ngx_exiting) {}

                            ngx_process_events_and_timers();

                            ….

                            if (ngx_terminate) {}

                            …

                            if(ngx_reopen) {}

                   }

}

在该片段中,Worker进程通过ngx_process_events_and_timers()->ngx_process_events()->epoll_wait()进入阻塞等待。一旦有事件发生或者信号量收到就会立即返回,然后工作进程对事件进行处理。

3、核心进程模型—缓存管理进程

如果Nginx开启了缓存功能,Nginx启动时会创建两个与Cache相关机制有关的进程,一个cacheloader缓存加载进程,一个cache manage缓存管理进程。Cache 进程不处理客户端请求,不处理I/O事件,他们仅仅处理超时事件,在ngx_process_events_and_timers中仅有ngx_event_expire_timer()事件。

Cache Manage进程和Cache Loader进程的执行主体都是ngx_cache_manager_process_cycle(),但是他们的初始化上下文参数不一样,由于在上下文参数中初始化的事件处理函数不同,从而分化出缓存管理和缓存加载两个完全不同的进程。Cache Manage进程的主要任务是清楚超时缓存文件,限制缓存文件总大小;Cache Loader进程的主要任务是在Nginx启动时将上次系统退出时保留在磁盘上的文件加载到内存中。


代码片段如下:

ngx_cache_manager_process_cycle(){

           ngx_close_listening_sockets();

           …

           ngx_worker_process_init();

           ngx_add_timer(&ev);

          

           for(;;){

                    …

                    ngx_process_events_and_timers();

}

}

    三、总结

通过本节的学习,我们知道了Nginx整体进程架构和各进程的工作概况。在下节内容中,我们将继续分析Nginx的进程通信机制,包括SocketPair方式,Linux典型的共享内存和Slab机制等内容。

敬请期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值