nginx是一个性能堪比Apache的web服务器,其高性能与其设计架构是有着很大的关系的。
nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程
1.高度模块化
高度的模块化设计是nginx的架构基础,在Nginx中,除了少量的核心代码,其它一切皆为模块
2.事件驱动架构
由一个事件发生源去产生事件,一个或多个事件收集器去收集、分发事件,多个事件处理器去消费事件。对于nginx而言,一般会由网卡、磁盘产生事件。事件模块去收集和分发事件,所有的模块去消费事件。
3.请求的多阶段异步处理
采用异步非阻塞的方式去处理客户端的请求,因此保证其高并发能力
同步和异步是描述通信模式的概念,而阻塞和非阻塞是描述处理调度方式的概念
4.master-worker的工作模式
nginx启动后,在unix系统中会以daemon的方式在后台运行,后台进程包括一个master进程和多个worker进程。
master-worker工作模式:
1.master通过接受客户端的请求并解析,通过进程间通信,将相应的指令发送给worker进程,从而实现对worker的控制;
2.每个worker进程都会竞争同一个共享锁,只有竞争到共享锁的进程才能够处理客户端请求;
3.当worker进程接收到master发送的客户端请求信号之后,worker进程会处理该请求的事件,若是accept事件,则将其添加至accept队列中,如果是read或write事件,则会将其添加到read-write队列中
4.在将事件添加到对应的队列中之后,对于accept队列,在持有共享锁的情况下,会处理完accept队列中的客户端请求,对于read-write队列,会在释放锁之后去处理队列中的read或者是write事件
master进程主要用来管理worker进程。包含:接收外部的信号,向worker进程发送信号,监控worker进程的运行状态,当worker进程异常退出后,会重新启动一个worker进程
worker进程主要用来处理事件,由于一个master进程管理多个worker进程,因此worker进程之间是平等的,多个worker进程去竞争来自客户端的请求,各个进程之间是独立的,一个请求只能被一个worker进程所处理。
5.内存池的设计
将向系统申请内存空间的请求整合起来,一次向系统申请内存空间,降低了cpu的消耗
惊群现象
惊群现象是指当一个事件被触发时,所有等待该事件的进程或者线程都被唤醒,从而全部去竞争该资源,但是最后只有一个进程或线程获得该资源,其他的进程或线程重新进入休眠状态。惊群现象一般是socker的accept()导致。例如nginx,其worker进程是由master进程fork产生,在master进程中,需要先建立好需要监听的socket,然后在fork出多个进程,这多个进程去accept同一个socket,当一个连接进来之后,所有的进程都会收到通知,并且去竞争同一个连接,但是只有一个进程能够accept并建立连接。
惊群现象会导致linux内核对进程或者是线程频繁地做无效调度,上下文切换等导致系统性能下降。
Linux2.6版本之后,通过引入一个标记为WQ_FLAG_EXCLUSIVE,解决了accept的惊群现象
nginx通过加锁的机制,进程间的通信保证负载均衡(即连接数满的worker不去获得accept锁)以及timeout的设定(保证没有拿到accept锁的进程,去拿锁的频度更高)