Nginx 原理
# 42.Nginx 原理
讲解下 Nginx 内部的原理
# mater 和 worker 的概念
启动 Nginx 进程后,我们发现 Nginx 其实是有 2 个进程的:
# ps -ef | grep nginx
root 14858 1 0 07:35 ? 00:00:00 nginx: master process ./nginx
nobody 14860 14858 0 07:35 ? 00:00:00 nginx: worker process
2
3
一个是 master 进程,一个是 worker 进程。Nginx 是这样工作的:
- 首先启动一个 master 进程
- 然后启动一个或多个 worker 进程
- worker 进程是用来工作的,也就是处理请求
- master 进程则是用来管理 worker 的,将活分给 worker 进程
示意图:
# master+worker 机制如何工作
首先,一个请求来到了 Nginx,那么 master 就要开始工作了:
- master 告诉所有 worker,有新的请求
- 然后 worker 是通过争抢的方式去处理这个请求
- 一个 worker 抢到请求后,会看情况是否需要转发给 Tomcat,还是自己直接处理。
# 一个 master 和多个 woker 的好处
为什么 Nginx 要这样设计呢?因为这样有很多好处,例如:
- 首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
- 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。
- 如果有 worker 进程异常退出,会导致当前 worker 上的所有请求失败,但不影响到所有请求,降低了风险
- 可以使用 nginx -s reload 热部署,也就是不用重启 Nginx 也可以让新的配置生效:没有抢到请求进行处理的 worker,会自己更新,而正在处理请求的 worker 进程不会停止处理请求,这样即使在热部署期间,Nginx 还是在正常处理请求的。等处理完后再自己更新。
- ...........
# 需要设置多少个 worker
Nginx 同 redis 类似都采用了 IO 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。
每个 worker 的线程可以把一个 cpu 的性能发挥到极致,所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
注意,在 Windows 下的话则没有 IO 多路复用机制,所以在 Windows 下,Nginx 的性能会降低不少(Redis 同理,最好安装到 Linux 下使用)
Nginx 默认没有开启利用多核 cpu,我们可以通过设置 worker 数量和设置 worker_cpu_affinity 配置参数来充分利用多核 cpu 的性能。配置实例:
2 核 CPU,开启 2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;
2
# 连接数 worker_connection
这个值是设置每个 worker 进程所能建立连接的最大值。
worker_connections 1024
举个例子,一个请求发送过来,那么这个请求到 worker 进程之间有一个连接,并且 worker 到请求之间也有一个连接;
而如果这个请求涉及到转发给 Tomcat 处理,那么还得占用 2 个连接:worker 进程到 Tomcat 之间占用一个,Tomcat 进程到 worker 进程占用一个
┌─────────┐ ┌─────────┐ ┌─────────┐
│ │ ←─────── │ │ ─────→ │ │
│ Client │ │ Worker │ │ Tomcat │
│ │ │ │ │ │
│ │ ──────→ │ │ ←───── │ │
└─────────┘ └─────────┘ └─────────┘
2
3
4
5
6
综上,Nginx 支持的最大并发数是多少得分类讨论:
- 普通的静态访问最大并发数是: (worker_connections × worker_processes) / 2
- 如果是 HTTP 作为反向代理来说,最大并发数量应该是 (worker_connections × worker_processes)/ 4
# 最后
通过前面的讲解,其实基本上够我们使用了,但有些时候学多一点,使用起来更得心应手,后续我们会介绍一些 Nginx 常用的配置,读者可以看情况阅读。