Nginx 基本原理解析

本文最后更新于:2 年前

Nginx 进程模型

master 和 worker

启动 Nginx 后,我们可以擦看到有 master 和 worker 两个进程:

Nginx默认采用多进程工作方式,Nginx 启动后,会运行一个 master 进程和多个 worker 进程。

其中 master 充当整个进程组与用户的交互接口,同时对进程进行监护,管理 worker 进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求:

nginx的进程模型

worker 工作流程

master-workers 机制优势

  1. 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作。

    对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

  2. 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断。

    采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

多少个 woker 合适

worker 数和服务器的 cpu 数相等是最为适宜的。

Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。

每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

1
2
3
4
5
6
\#设置 worker 数量。
worker_processes 4
\#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
\#work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 0000100

连接数 worker_connection

这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。

当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes / 2.

如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

发送请求,占用了 woker 的 2个 或者 4 个连接数

案例

nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

  • 普通的静态访问最大并发数是: worker_connections * worker_processes /2。(4 × 1024 / 2)
  • HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4。(4 × 1024 / 2)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!