Nginx原理初探


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
2
3
4
5
6
events {
# 默认使用epoll
use epoll;
# 每个worker允许连接的最大数
worker_connections 1024;
}

拓展:

在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;

推荐文章

初探Nginx架构之进程模型与事件处理机制