Nginx命令行及演示:重载、热部署,日志切割
Nginx命令行
- 格式:nginx-s reload
- 帮助:-?-h
- 使用指定的配置文件:-c
- 默认的情况下,我们编译出来的Nginx会寻找我们执行configure时指定的位置的配置文件,但是在命令行中可以人为的指定另一个配置文件, -c 加上配置文件的路径
- 指定配置指令:-g
- 在nginx configure目录里有很多条指令,但是那些指令需要在命令行中覆盖中间的一些指令,可以使用-g做到
- 指定运行目录:-p
- 运行目录下会有很多子目录,,比如说log,如果我们指定了运行目录,它会把我们在configure中定义好的目录替换掉
- 发送信号:s
- nginx操作运行进程的方法一般是发送信号,既可以通过linux kill命令,也可以通过nginx -s这个子命令,这个子命令后可加
- 立刻停止服务:stop
- 优雅的停止服务:quit
- 重载配置文件:reload(但是是用优雅的停止服务这种方式)
- 重新开始记录日志文件:reopen (也就是说换一个nginx日志文件,会新打开一个文件重头记录)
- 测试配置文件是否有语法错误:-t -T
- 改了配置文件以后不知道有没有语法错,测试配置文件
- 打印nginx的版本信息、编译信息等:-v -V
- -v 查看版本信息
- -V 编译它的时候,用configure这个脚本执行的时候所加的所有的参数都可以在这里看到
重载配置文件
- 修改nginx配置文件中的一些值(在安装的目录下 有conf sbin)
- 比如vim conf/nginx.conf 将#tcp_nopush on;去掉#,打开。
- 当修改完配置文件后,在sbin目录下直接执行 ./nginx -s reload
- 这样nginx不停止对客户服务情况下,使用了tcp_nopush on这个新的配置项
热部署
- nginx正在运行,现在想更换最新版本的nginx
- 假如现在下载了一个更新的nginx,首先将现有的nginx二进制文件备份,因为我更换的只是二进制文件,不更换其他文件
cp nginx nginx.old
- 接下来,需要把我们编译好的最新版本的nginx二进制文件拷贝到这个目录中替换现在进程正在使用的nginx文件
- 给正在运行的nginx的master进程发一个信号,告诉他我们开始热部署了,做一次版本升级。
- 这时我们给master发一个信号kill -USR2 45223(master进程号)
- 接下来我们会看到nginx master进程会新起一个nginx master进程
- 新的master进程使用了我们刚刚复制进来的nginx二进制文件来启动的
- 老的worker也在运行,新的master生成新的worker,他们平滑地会把所有请求过渡到新的二进制文件中,nginx起的进程中
- 新老master,worker进程都在运行,老的worker进程已经不再监听80这样的web端口了,所有新的请求新的连接只会进入新的nginx进程中
- 这个时候,我们需要向老的nginx进程发送一个信号,kill -WINCH 45223,告诉它请优雅的关闭你的所有的worker进程
- 老的worker进程已经退出了,老的master进程还在,但是没有对应的worker进程了,这说明所有的请求已经切换到我们新设计的nginx中了
- 但是我们肯会发现一些问题,需要将新版本退回到老版本,对于45223,还可以发送reload命令,让它重新将worker进程拉起来,再把新版本关闭,所以说老的master进程是不会退出的,保留在这里,允许我们做版本回退
日志切割
- 需要把当前的日志备份到另外的文件中,但是nginx还是正常运行的
- 如 logs目录下 xxx.log
- 在logs目录下先拷贝一份放在另一个位置mv xxx.log bak.log
- 接着 ../sbin/nginx -s reopen
- nginx 重新生成一个xxx.log ,原先log备份成bak.log,这样我们就实现了日志切割
- 可以写成bash脚本,先复制文件脚本,在执行reopen命令