Nginx作为边缘节点,它处理的流量是其他节点的数倍,是如何处理上万的请求了?
我们将从Nginx的进程管理机制和请求处理流程2个方面介绍Nginx如何高效的处理请求。
进程管理机制
Nginx设计了合理的进程模型,合理的分配工作,让Nginx进程有序的处理请求。
Nginx进程模型
Nginx的进程模型分为单进程模型和多进程模型。
单进程模型只有Master进程,所有的工作由Master进程完成,适用于开发调试模式。我们可以在主配置端配置master_process on开启单进程模式。
多进程模型包含Master进程、Worker进程和Cache进程。它是Nginx默认的方式,更加的健壮,适用于生产环境多核架构。下图可以看出Worker进程和Cache进程是Master进程的子进程。
Nginx进程分工
Nginx多进程模型分工非常明确。
Nginx的Master进程负责监控和管理Worker进程、Cache进程的状态,当发现子进程异常会重新启动一个新的子进程。另外,Master进程负责读取配置文件并验证配置文件的有效性和正确性,并通过通知子进程使用新的配置。
Nginx的Worker进程负责处理客户端的请求。它既需要与客户端保持连接接收客户端的请求,也需要与上游服务器通信,接收上游服务器的响应报文发送给客户端。
Nginx的CacheLoader和CacheManager进程主要负责管理缓存数据。CacheLoader进程负责缓存数据,而CacheManager进程负责管理缓存的过期时间。
Nginx启动
上一篇博文中我们介绍了Nginx的管理命令,Nginx启动、优雅重启的背后做了哪些准备工作了?
通过开启Nginx的Debug日志去观察Nginx的启动过程,总结了如下图示。
我们都知道优雅重启(nginx -s reload)是不影响业务的同时完成新的配置加载。在业务繁忙时期执行Nginx优雅重启,可能出现Nginx的Worker进程的状态是 worker process is shutting down的情况,如下图。
通过开启Nginx的Debug日志观察Nginx优雅重启可以看出它经历了如下几个步骤完成优雅重启。
- Master进程收到管理员发来的Reload信号。
- Master进程检查配置文件语法正确性。如果正确则继续,否则报错并回滚配置。
- Master进程打开新的监听端口。
- Master进程使用新的配置文件启动新的Worker进程
- Master进程向老的Worker进程发送QUIT信号让其优雅退出。
- 老的Worker进程关闭监听句柄,并继续为当前连接提供服务
- 老的Worker进程处理完当前连接后结束进程
上图的的情况是由于118230的Worker进程已经关闭了监听句柄,并继续为当前的连接提供服务。由于当前的连接并未关闭所以该进程还不能退出,直到当前的连接断开该Worker进程才退出。
请求处理流程
为了更高效的处理请求,Nginx制定了处理请求的流程。
Nginx将Worker进程设计为可以同时处理成千上万个连接。每个Worker进程都是对等、独立并且同等竞争来自客户端的请求。Worker进程处理请求之前必须要抢夺锁并注册事件,这种方式避免了多个Worker进程处理同一个请求的情况。
开启Nginx的Debug日志去观察Nginx处理请求的过程总结如下图。
HTTP请求处理阶段
针对HTTP请求,Nginx定义了11个处理阶段保证HTTP请求处理过程的有序进行。
在源码的https://github.com/nginx/nginx/blob/master/src/http/ngx_http_core_module.h 107行至126行也能找到HTTP请求阶段的定义。
不管官方模块、第三方模块或者自定义模块,只要是需要处理HTTP的请求的模块,都需要定义请求处理阶段。