Nginx学习笔记之使用信号管理Nginx的父子进程
声明:图片来自 github:https://github.com/russelltao/geektime-nginx
使用信号管理Nginx的父子进程
- Nginx是一个多进程的程序,多进程之间进行通信可以使用共享内存,信号等。
- 在做进程间的管理时,通常只使用信号。
- 能够发送和处理信号的有Master进程,Worker进程,还有Nginx命令行。
-
Master进程
- 因为master进程可以启动worker进程,所以它管理worker进程的方式首先是监控worker进程有没有发送CHLD信号。因为linux操作系统规定,当子进程终止的时候,会向父进程发送CHLD信号。所以,如果worker进程一些模块出现了一些bug导致worker进程意外地终止掉,master进程可以立刻通过CHLD发现这样一个事件,然后重新把worker进程拉起。
-
mater进程还可以接收一些信号来管理worker进程。可以接收的信号有
- TERM,INT 表示立刻停止nginx进程
- QUIT 优雅地停止nginx进程(可以慢慢地停,对用户不要发送立刻结束连接,像TCP的reset请求这样的报文)
- HUP 表示重载配置文件
- USR1 重新打开日志文件,做日志文件的切割
- 上面四个信号可以通过使用nginx命令行加特定的命令直接向master进程发送的。
- 下面的信号只能通过kill 这样的linux的命令行直接向master进程发送信号。所以我们得先找到master进程的PID,对这个PID直接发送USR2和WINCH。这两个信号专门做热部署时使用。
-
Worker进程
- 通常我们不直接向worker进程发送信号,我们希望由master进程来管理worker进程。所以直接向worker进程发送信号,也会产生同样的结果。但通常我们不这样做,往往是对master进程进行管理,master进程收到信号以后,在把信号发送该worker进程。
-
Nginx命令行
- 当我们启动了Nginx以后,Nginx会把它的PID记到一个文件中,通常是记录到安装目录下的logs文件夹下的一个nginx pid文件中,这个pid文件中会记录master进程pid。
- 当我们再次执行 nginx -s 命令行的时候,那么nginx工具命令行会去读取pid文件中的master进程 的 pid,向这个pid同样的发送 HUP USR1 TERM QUIT这样的信号。
- 其实,调用nginx的命令行发送相应的命令,和直接使用 kill 去发送信号效果是一样的
- 当我们启动了Nginx以后,Nginx会把它的PID记到一个文件中,通常是记录到安装目录下的logs文件夹下的一个nginx pid文件中,这个pid文件中会记录master进程pid。