Nginx极客时间:使用信号管理Nginx的父子进程

使用信号管理Nginx的父子进程:

Nginx多进程之间进行通信可以使用 共享内存信号 等方式,当做进程间的管理时,通常只使用 信号 的方式。


Nginx中存在的信号主要有以下几种:

Nginx极客时间:使用信号管理Nginx的父子进程_第1张图片
其中,蓝色部分的信号是可以通过Nginx命令行 -s 加特定命令发出的,红色部分的信号只能通过 kill 命令加信号的方式直接发出。



1. Master进程处理的信号:

CHLD 信号:

Master进程管理Worker进程的主要方式就是通过监听CHLD信号。

Linux操作系统规定,当子进程退出时,会向父进程发送CHLD信号。

所以,当Worker进程因为一些模块出现了bug导致进程意外退出时,Master进程可以通过捕获CHLD信号立刻知道这一事件,并迅速将Worker进程重新拉起。

TERM、INT 信号:

当Master进程收到 SIGTERM 或者 SIGINT 信号,会立即停止进程。
在Nginx中,Master进程退出后Worker进程也会退出。


在Linux中,父进程能够收到子进程的CHLD信号,便于管理,但是在一般情况下,父进程退出时,是不会通知子进程的,这个时候子进程会成为孤儿进程,最终被init进程收养。

如何确保父进程退出的同时,子进程也退出?
一种实现方式是,当父进程退出的时候,向子进程发送 SIGKILL 信号,或者发送其他信号,由子进程捕获并做后续处理,以此达到父子进程共存亡的效果。

(遗留问题:Nginx中的父进程退出时是通过何种方式通知子进程退出的?)


QUIT 信号:

优雅的停止进程,不会立即停止,不会向客户端发送RST复位报文段。

HUP 信号:

表示 重载配置文件。
(相当于 ./nginx -s reload 命令)

USR1 信号:

表示 重新打开日志文件。
(相当于 ./nginx -s reopen 命令)

USR2 信号:

专门针对做热部署时使用,向master进程发送USR2信号后,master进程会拉起新的master进程,新的master进程再拉起新的worker进程。

WINCH 信号:

专门针对做热部署时使用,向老的master进程发送WINCH信号后,老的master进程会关闭老的worker进程。



2. Worker进程处理的信号:

worker进程也能接收并处理一些信号,通常我们不会对worker进程直接发送信号,因为我们希望通过master进程来管理worker进程。



3. Nginx命令行与信号的对应关系:

Nginx命令行 -s 发送的四个命令 reload、reopen、stop、quit 分别对应于向master进程发送信号 HUP、USR1、TERM、QUIT。


Nginx命令行 -s 功能的实现:

在Nginx启动时会记录下Nginx的master进程ID,在Nginx安装目录的 logs/ 目录下的 nginx.pid 文件中。
当调用Nginx命令行时,Nginx会自动从 nginx.pid 中找到master进程的进程ID并向其发送对应的信号。
所以说,Nginx命令行和使用 kill 直接发送信号的效果是完全相同的。

你可能感兴趣的:(Nginx)