Nginx 多进程架构
Nginx 多进程架构:一个master进程和多个worker进程;
- master进程:主要负责有轻而巧的工作,通过进程间通信对worker 进程发号施令或是处理来自bash的start,stop,reload等用户指令
- worker进程:主要负责重而笨的工作,处理来自客户端的连接等,多个worker共享一个监听套接字;
- worker进程由master进程fork而来
- 客户端请求处理机制:请求争抢;客户端请求到达nginx时,多个worker进程进行请求争抢
在Linux下,Nginx 使用 epoll 的 I/O 多路复用模型(常见的/O 多路复用模型包括: select 模型、 poll模型、 epoll 模型)
1 | events { |
拓展:
在TCP Socket 服务开发中,多进程或多线程共享监听套接字时会面临“惊群问题”(有兴趣了解一下);
对于主流的linux版本, accept 阻塞调用,已经不存在惊群问题,也就是说多个进程同时accept 同一个 监听套接字,只有一个进程获的连接;
Nginx 在linux系统中使用epoll_wait 非阻塞式的方式,对于epoll_wait 非阻塞式的创建连接方式,依旧存在惊群问题。
多进程架构好处:
热部署,可以使用nginx -s reload热部署
每个woker是独立的进程,如果有其中的一个woker出现问题,其他woker独立的继续进行争抢,实现请求过程,不会造成服务中断
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
Nginx同redis,类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以 worker数和服务器的cpu数相等是最为适宜的。设置少了会浪费cpu性能,设多了会造成cpu频繁切换上下文带来损耗。
在nginx配置文件全局块中,通过 worker_processes 参数配置worker 进程数,设置为 auto时,nginx则会自动设置与cpu核心数相同的数量worker 进程。
1
worker_processes auto;