master和worker进程

nginx启动后,会以守护进程(daemon)的形式在后台运行。

后台进程包含一个master进程和多个worker进程。

worker进程一般配置为跟CPU核数一样就可以。

比如下面的配置,worker_processes配置为auto,那nginx启动后,worker进程的数量就跟CPU的核数是一样的。

user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;# ......

如下截图所示:

图片

master是管理进程,只有一个,是专门管理worker进程。

worker进程则处理网络事件。

这样的好处是:

1、充分利用机器的核数,发挥并发的能力

2、负载均衡(比如upstream)

3、热更(比如nginx -s reload的流程)

热更流程

当修改了配置,执行nginx -s reload命令后,nginx的热更流程如下所示。

1、启动一个新的master进程,并使用新的配置来启动新的worker进程。

旧的worker进程就不再接受新的请求,如果此时有正在处理的请求,则会继续处理完。

2、新的和旧的master进程和worker进程会同时存在。

nginx会向老的master进程发送WINCH信号,关闭旧worker进程,然后观察新的worker进程是否正常。

如果没问题,那nginx就会向老的master进程发送QUIT信号,关闭老的master进程和worker进程。

思考

一、nginx是多进程模型,那为什么不采用多线程呢?

首先,我们回顾下两个概念:

1、进程:是并发执行的程序,在执行过程中分配和管理资源的基本单位。

2、线程:是进程的一个执行单元。比进程更小的独立运行的基本单位。

nginx是多进程模型,不采用多线程的原因,可以参考如下几点:

1、无状态服务,无需共享进程内存。

2、采用独立的进程,可以让互相之间不会影响。一个进程异常崩溃,其他进程的服务不会中断,提升了架构的可靠性。

3、进程之间不共享资源,不需要加锁,省掉了锁带来的开销。

4、进程数已经等于核心数,再新建线程处理任务,只会抢占现有进程,增加切换代价。

5、作为接入层,基本上都是数据转发业务,网络IO任务的等待耗时部分,已经被处理为非阻塞/全异步/事件驱动模式,在没有更多 CPU 的情况下,再利用多线程处理,意义不大。并且如果进程中有阻塞的处理逻辑,应该由各个业务进行解决。

二、nginx怎么保证高并发?

nginx采用epoll。

epoll基于事件驱动,它可以监控多个事件是否准备完成。

如果准备好了,那就可以放入epoll队列中,这个过程是异步的。

worker进程只需要从epoll队列中循环处理就可以。

三、nginx vs haproxy

两者的定位有所不同的。

nginx是一个web服务器和反向代理服务器,

而Haproxy是一个load balancer。

四、nginx怎么实现高可用?比如nginx挂了怎么办?

目前主要是通过keepalived+nginx来实现高可用。

keepalived主要是通过虚拟路由冗余来实现高可用。

虚拟路由冗余,也就是VRRP,全称是Vritrual Router Redundancy Protocol。

keepalived是通过VRRP实现网络的不间断稳定运行。

如果某个节点出现异常,keepalived检测到后,会将故障的节点从集群系统中剔除。

最后

如果觉得文章还可以,请点赞或在看,谢谢。

有任何问题都可以留言咨询。

作者 灰武士