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

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

Nginx-master信号处理流程以及其信号集

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

大致流程

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

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

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

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

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

信号集

nginx -s 对应参数信号含义English
stopTERM强制关闭整个服务Shut down quickly.
nullINT强制关闭整个服务Shut down quickly.
quitQUIT优雅地关闭整个服务Shut down gracefully.
reopenUSR1重新打开日志记录Reopen log files.
reloadHUP重新读取配置文件,并且优雅地退出老的workerReload configuration, start the new worker process with a new configuration, and gracefully shut down old worker processes.
nullUSR2平滑升级到新版本Upgrade the nginx executable on the fly.
nullWINCH优雅地关闭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. 压缩旧日志/或者其他操作。

官方的实例脚本

$ 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
comments powered by Disqus