nginx重载、热部署、日志分割

1,149 阅读3分钟

一、nginx命令行

  • 格式:nginx -s reload

  • 帮助:-h, 比如nginx -h

  • 使用指定的配置文件:-c

  • 指定配置指令:-g

  • 指定运行目录:-p

  • 发送信号:-s

  • stop:立即停止服务

  • quit:优雅的停止服务

  • reload:再不停止用户服务的情况下,重载配置文件。

  • reopen:重新开始记录日志文件

  • 测试配置文件是否存在语法错误:-t、-T

  • 打印nginx的版本信息:-v、-V

启动时使用./sbin/nginx -s reload,因为使用nginx -s relaod启动的是全局的,当有使用homebrew安装nginx时,启动的时homebrew安装的nginx。

二、重载

当我们更改nginx.conf配置文件之后,使用nginx -t检测是否有语法错误,没有则使用nginx -s reload进行重载。

三、热部署

热部署就是在不停止nginx的情况下升级nginx。

这里我有两个版本的nginx,nginx-1.20.1是当前使用的版本,nginx-1.21.3是最新版本。

可以进入nginx-demo中使用./sbin/nginx -v查看当前nginx项目的版本。

  • 进入nginx-demo/sbin文件中,使用cp nginx nginx.old对当前版本的nginx文件进行备份,
  • 进入nginx-1.21.3文件夹中,使用./configure --prefix=../nginx-demo1指定创建的nginx项目目录。
  • 使用make进行编译,使用make install安装包。
  • 进入nginx-demo1/sbin文件中,使用cp -f ./nginx ../nginx-demo/sbin/nginx将1.21.3版本的nginx文件拷贝到1.20.1中,也可以拷贝nginx-1.21.3/objs/nginx(不进行make install时可以拷贝该文件)。
  • 进入nginx-demo/sbin中,使用./nginx -v可以查看当前版本为1.21.3,使用nginx -v会查看全局nginx版本,不是当前nginx-demo项目的版本。
  • 使用ps -ef | grep nginx查看当前的nginx进程号,像这里5335就是我的nginx进程号:

  • 使用kill -USR2 5335告诉nginx要开始进行热部署了,执行这个命令之后,我们再查看进程,会发现master进程会启一个新的master进程(下午8:55的这个进程),这个新的master进程使用的nginx二进制文件是1.21.3版本的二进制文件,新的master进程会生成一个新的worker进程,请求就会被转到新的nginx中。

  • 最后使用kill -WINCH 5335告诉旧版本的nginx可以优雅的关闭了。此时旧版的worke进程就已经关闭了,但是旧的master进程还在,原因看补充。

四、日志切割

在conf文件中创建一个cut_log.sh文件,其内容为:

#!/bin/bash
LOG_PATH=/etc/nginx/logs
CUR_LOG_PATH=/etc/nginx/logs
YESTERDAY=$(date +%F -d -1day)

mv $CUR_LOG_PATH/access.log $LOG_PATH/${YESTERDAY}_access.log
mv $CUR_LOG_PATH/error.log $LOG_PATH/${YESTERDAY}_error.log

gzip ${LOG_PATH}/${YESTERDAY}_access.log
gzip ${LOG_PATH}/${YESTERDAY}_error.log

kill -USR1 $(cat /etc/nginx/logs/nginx.pid)

并执行chmod +x ./cut_log.sh 为该文件开启执行权限。再执行./cut_log.sh,查看日志是否被分割,此时只能日志已经能被切割了,但是我们希望它能再每天的23:59时自动切割,需输入crontab -e,并添加以下代码:

59 23 * * * bash /etc/nginx/conf/cut_log.sh

这样日志就可以自动切割,并且进行压缩了。

五、补充

  • 使用./sbin -s reload时,报错:

    nginx: [error] invalid PID number "" in "../nginx-demo/logs/nginx.pid"

这是因为没有指定启动的nginx.conf文件,在nginx-demo目录下使用:

./sbin/nginx -c ./conf/nginx.conf

指定要启动的配置文件就可以了。

  • 使用kill -WINCH pid通知旧版本的nginx之后,为什么master进程还在?

原因是方便回退到旧版本。比如新版本有问题时,我们要回退到旧版本,就可以使用./nginx -s reload重新启动旧版本nginx,此时nginx文件应是旧版本的nginx文件,之后使用kill -WINCH pid关闭新版本的nginx进程即可。