# 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 发送同样的 HUPUSR1TERMQUIT 这样的信号,而这样的信号对应的命令就是 reloadreopenstopquit,所以执行相关的 nginx 命令行和直接用 kill 发送信号是等价的。

# 参考

更新时间: 9/22/2020, 3:49:41 AM