nginx 通过信号来控制。对应linux系统就是用kill
命令。
master进程id在默认写入到/nginx/logs/nginx.pid
文件中。文件也可以在nginx.conf
文件中指定。master进程支持以下信号:
kill -TERM `cat ./logs/nginx.pid` #快速停止master进程。
kill -QUIT `cat ./logs/nginx.pid` #优雅的停止。
kill -HUB `cat ./logs/nginx.pid` #改变配置文件。开启一个新的worker进程处理,优雅的停止老的worker 进程。相当于nginx -s reload
kill -USR1 `cat ./logs/nginx.pid` #重新打开log文件。-s reopen命令
kill -USR2 `cat ./logs/nginx.pid` #升级可执行文件。热部署
kill -WINCH `cat ./logs/nginx.pid` #优雅的关闭worker进程。
每个worker进程也可以接收信号:
kill -TERM xxx #快速关闭worker进程
kill -QUIT xxx #优雅退出
kill -USR1 xxx #重新打开日志文件,先mv一个,再去执行这个命令。-s reopen命令
更改配置文件
- 发送HUP信号给master进程。
- master检查新的配置文件语法是否合理。
- 如果合理,根据新的配置文件打开新的socket连接监听。会创建新的worker进程,然后通知老的worker进程优雅的关闭。老进程收到消息后完成当前客户端的请求,然后自动关闭。
- 如果不合理,回滚,使用原先的配置文件继续运行。
日志切割
- 手动重命名log文件。
- 给master进程发送USR1信号。
- 重新打开文件。
热部署
备份一下原先的nginx文件。
把新的nginx二进制文件放到原先相同目录下。
给master进程发送USR2信号。
master进程会把
logs/nginx.pid
文件复制一份为logs/nginx.pid.oldbin
,然后运行新的nginx文件,生成新的worker进程。新老master和worker共存。(如果没有成功可以看
logs/error.log
是否有日志)给老master进程发送
WINCH
信号,老master就会发送信号让他对应的worker进程优雅的退出。QUIT信号。然后就剩新的master和worker进程,以及老的master进程。
注意:老的master进程不会退出。可以用于必要时候的回滚操作。有两种情况。
- 给老的master进程发送HUP信号,它会以不读取
nginx.conf
的方式启动新的worker进程。然后再给新的master进程发送QUIT信号让他优雅的退出。 - 给新的master进程发送TERM信号,它会通知自己的worker进程立即退出。如果退出不成功,使用kill让worker进程强制退出。新的master退出之后,老的master进程会自动启动新的worker进程。
如果回滚,那么第四步的nginx.pid.oldbin
文件会被丢弃。
如果升级成功,就给老的master进程发送QUIT
信号,让其优雅的退出。