Nginx-master信号处理流程以及其信号集(热更新/日志切割)

本文是Nginx系列文章中的一篇,如果你对Nginx一点都不懂,可以先去看先前的文章。

大致流程

下面这破图,我用grafio3画得贼辛苦。我觉得grafio3好难用啊。。。

  1. master进程不处理业务请求,主要是对worker进程负责,重启服务,平滑升级(热部署),更换日志文件,实时生效配置文件等等。

  2. master进程一开始会根据进来的参数来启动workers

  3. workersoj8k之后,master就挂起,等信号。

  4. 可以使用kill发送信号,也可以使用nginx自带的命令参数-s [signal]

信号集

nginx -s 对应参数 信号 含义 English
stop TERM 强制关闭整个服务 Shut down quickly.
null INT 强制关闭整个服务 Shut down quickly.
quit QUIT 优雅地关闭整个服务 Shut down gracefully.
reopen USR1 重新打开日志记录 Reopen log files.
reload HUP 重新读取配置文件,并且优雅地退出老的worker Reload configuration, start the new worker process with a new configuration, and gracefully shut down old worker processes.
null USR2 平滑升级到新版本 Upgrade the nginx executable on the fly.
null WINCH 优雅地关闭worker(在热更新的时候必用) Shut down worker processes gracefully.

热更新 线性逻辑顺序

具体以及理由看隔壁的文章-Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割

这里全部使用kill来发送命令到指定的进程。

  1. 备份旧的二进制文件

  2. 采用新的二进制文件覆盖旧的二进制文件

  3. 发送USR2老的master进程

  4. 发送WINCH老的master进程

  5. 发送QUIT老的master进程

日志切割 线性逻辑顺序

具体以及理由看隔壁的文章-Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割

使用reopen进行日志切割。

  1. 使用mv重命名日志文件。(mv不会影响日志文件的写入,详见Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割)

  2. 发送USR1master进程

  3. 如果你还要把日志进行连续的操作,等待起码1s,必须,务必。不然可能会导致日志丢失,详见Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割

  4. 压缩旧日志/或者其他操作。

官方的实例脚本

1
2
3
4
$ mv access.log access.log.old
$ kill -USR1 master.nginx.pid 或者 nginx -s reopen
$ sleep 1 #务必
$ gzip access.log.old # do something with access.log.old
0%