本文是Nginx系列文章中的一篇,如果你对Nginx一点都不懂,可以先去看先前的文章。
大致流程
下面这破图,我用grafio3
画得贼辛苦。我觉得grafio3
好难用啊。。。
master进程不处理业务请求,主要是对worker进程负责,重启服务,平滑升级(热部署),更换日志文件,实时生效配置文件等等。
master进程一开始会根据进来的参数来启动
workers
。workers
oj8k之后,master
就挂起,等信号。可以使用
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
来发送命令到指定的进程。
备份旧的二进制文件
采用新的二进制文件覆盖旧的二进制文件
发送
USR2
到老的master进程
发送
WINCH
到老的master进程
发送
QUIT
到老的master进程
日志切割 线性逻辑顺序
具体以及理由看隔壁的文章-Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割。
使用reopen
进行日志切割。
使用
mv
重命名日志文件。(mv不会影响日志文件的写入,详见Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割)发送
USR1
到master进程
。如果你还要把日志进行连续的操作,等待起码
1s
,必须,务必。不然可能会导致日志丢失,详见Nginx 命令行 / 重载配置文件 / 热部署 / 日志切割。压缩旧日志/或者其他操作。
官方的实例脚本
1$ mv access.log access.log.old
2$ kill -USR1 master.nginx.pid 或者 nginx -s reopen
3$ sleep 1 #务必
4$ gzip access.log.old # do something with access.log.old