一、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进程即可。