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检测到后,会将故障的节点从集群系统中剔除。
最后
如果觉得文章还可以,请点赞或在看,谢谢。
有任何问题都可以留言咨询。