# Nginx 进程模型
# Nginx 进程结构
Nignx 包含两种进程结构,一种是单进程结构。一种是多进程结构。单进程结构只适合开发,生成环境使用多进程结构。可以保证高性能,高可用,以及利用多核CPU的性能。默认情况下,都是开启多进程模式。
# 多进程模型
# master进程
负责监控,管理worker进程。监控worker进程是否正常,是否需要进行热部署,是否需要重载配置文件等。此外,虽然nginx支持在master进程添加一些第三方模块的自定义方法,但是第三方模块基本不会这样做。
# worker进程
worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。多个worker进程之间共享缓存。
# cache进程
包括cache manager和cache loader进程,主要是反向代理时为后端发来的动态请求做缓存使用。
- cache loader:缓存载入
- cache manager:缓存管理
# 多进程与多线程
因为多线程共享一个进程的资源,一个线程出错会导致整个进程崩溃,会导致nginx挂掉。为了实现高可用性,高可靠性。Nginx被设计为多进程模型。一个进程崩溃,不会影响其它进程的运行。
nginx采用事件驱动模型,所以nginx希望每一个worker进程从头到尾占用1颗cpu,配置worker进程的数量和cpu核数一样,把每个worker进程绑到对应的cpu核上,更好使用每颗的cpu缓存,减少cpu缓存失效的命中率。以及减少进程切换造成的性能损耗。
# 进程管理
通常进程间的通信使用 共享内存
和 信号
,而进程间的管理是使用的是 信号
和 命令行
.
# Master进程
Master进程
对 Worker进程
进行监控和管理,当 Worker进程
由于一些模块出现bug,导致进程终止时,会给Master进程
发送 CHLD
信号,Master进程
接收到信号,会重新拉取一个新的 Worker进程
。
Master进程
还会通过接受一些信号,来管理 Worker进程
。
Master进程
可以接受的信号有:
- TERM、INT:立刻停止 Nginx 进程
- QUIT:优雅停止 Nginx 进程,不会对用户立刻发送结束连接请求
- HUP:表示重载配置文件。向老 master发送 HUP 则相当于把老版本的 Nginx 恢复处理请求了。可以用于版本回退。
- USR1:表示重新打开日志文件,做日志文件的切割
- USR2:针对做热部署使用,表示重新生成一个新的
Master进程
。针对版本回退,表示让新版本的nginx服务停止接收用户请求。 - WINCH:优雅的关闭需要停止服务的
Master进程
管理的所有Worker进程
其中, USR2 和 WINCH 只能通过 Linux 的 kill 命令行发送信号给 Master进程
,也就是说我们需要先找到 Master进程
所在的 PID,对这个 PID 发送 USR2 或者 WINCH,而其他的 4 个有对应的 Nginx 命令的。
# Worker进程
虽然直接对 worker 进程发送信号,也会让 worker 进程产生同样的结果,但是通常不这样做,往往是由 master 进程管理,master 进程收到信号后,会再把信号发送给 worker 进程。
# 命令行
Nginx 在启动以后,Nginx会把他的 PID 记录在一个文件中。通常默认是记录在 Nginx安装目录的 /logs/nginx.pid
文件中,记录了 Master进程
的 PID。
当我们执行 nginx -s
这样的命令行的时候,那么 nginx 的工具命令行就会去读取PID文件中的 Master进程
的 PID,向这个 PID 发送同样的 HUP
、USR1
、TERM
、QUIT
这样的信号,而这样的信号对应的命令就是 reload
、reopen
、stop
、quit
,所以执行相关的 nginx 命令行和直接用 kill 发送信号是等价的。