在实际的生产环境当中,每分每秒都会有客户在访问我们的nginx服务器。这样,我们就不能直接重启服务或reload重新加载配置,否则会影响客户的访问,甚至导致Nginx服务器崩溃,严重影响用户体验!这就需要将服务平滑升级。

系统环境:RHEL7.3

一、首先需要两个不同版本的Nginx安装包

[[email protected] ~]# ls
nginx-1.15.8.tar.gz  nginx-1.16.0.tar.gz

二、先安装nginx-1.15.8

1.解压源码包

[[email protected] ~]# tar zxf nginx-1.15.8.tar.gz

2.为Nginx添加语法检测(方便编写配置文件,减少出错率)

mkdir ~/.vim
cd nginx-1.16.0/contrib/
cp -r vim/* ~/.vim/

Nginx的平滑升级及版本回退,日志切割

3.修改编译配置文件,使其不debug

vim auto/cc/gcc
====================
171 # debug
172 #CFLAGS="$CFLAGS -g"

Nginx的平滑升级及版本回退,日志切割

4.解决编译依赖,并配置

yum install -y pcre-devel zlib-devel gcc
./configure --prefix=/usr/local/nginx --with-file-aio

Nginx的平滑升级及版本回退,日志切割
Nginx的平滑升级及版本回退,日志切割
Nginx的平滑升级及版本回退,日志切割

5.编译安装

make && make install

Nginx的平滑升级及版本回退,日志切割

6.查看Nginx版本

cd /usr/local/nginx/sbin/
./nginx -t
./nginx -V

Nginx的平滑升级及版本回退,日志切割

7.添加Ngnix用户

useradd nginx

Nginx的平滑升级及版本回退,日志切割

8.修改文件系统数目限制

vim /etc/security/limits.conf
=================================
 61 # End of file
 62 nginx   -       nofile          65535

Nginx的平滑升级及版本回退,日志切割

9.修改Ngnix配置文件

cd /usr/local/nginx/conf/
vim nginx.conf
==========================

  2 user  nginx nginx;
  3 worker_processes  auto;

 12 events {
 13     worker_connections  65535;
 14 }

Nginx的平滑升级及版本回退,日志切割

10.开启Nginx服务

./nginx
./nginx -V

Nginx的平滑升级及版本回退,日志切割

三、将nginx-1.15.8平滑升级为nginx-1.16.0

1.解压缩

[[email protected] ~]# tar zxf nginx-1.16.0.tar.gz
[[email protected] ~]# ls
nginx-1.15.8  nginx-1.15.8.tar.gz  nginx-1.16.0  nginx-1.16.0.tar.gz

2.配置、编译

[[email protected] ~]# cd nginx-1.16.0/
[[email protected] nginx-1.16.0]# pwd
/root/nginx-1.16.0
[[email protected] nginx-1.16.0]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.15.8
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-file-aio
[[email protected] nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-file-aio
[[email protected] nginx-1.16.0]# make 

Nginx的平滑升级及版本回退,日志切割
Nginx的平滑升级及版本回退,日志切割

3.查看新生成的二进制执行文件

[[email protected] nginx-1.16.0]# cd objs/
[[email protected] objs]# ls
autoconf.err  nginx    ngx_auto_config.h   ngx_modules.c  src
Makefile      nginx.8  ngx_auto_headers.h  ngx_modules.o
[[email protected] objs]# ./nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-file-aio

Nginx的平滑升级及版本回退,日志切割

4.备份原有Nginx启动脚本(以防止升级失败无法版本回退)

[[email protected] objs]# cd /usr/local/nginx/sbin/
[[email protected] sbin]# cp nginx nginx.old
[[email protected] sbin]# ls
nginx  nginx.old

Nginx的平滑升级及版本回退,日志切割

5.将新版本的脚本复制到旧版本的脚本目录下

[[email protected] sbin]# cd -
/root/nginx-1.16.0/objs
[[email protected] objs]# cp -f nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y

Nginx的平滑升级及版本回退,日志切割
此时/usr/local/nginx/sbin/目录下的nginx为新版本的执行文件,nginx.old为旧版本的二进制执行文件
Nginx的平滑升级及版本回退,日志切割

6.查看Nginx进程号

查看到此时nginx的master进程和worker进程:

ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割
客户端查看此时生效的nginx服务器:
Nginx的平滑升级及版本回退,日志切割
此时为nginx/1.15.8生效

7.替换服务

Nginx的平滑升级及版本回退,日志切割
注意:此时4852为旧版本的master进程,4853为所属master的worker进程

ps -ef | grep nginx
kill -USR2 4852
ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割
注意:17125为新版本的master进程,17126为所属master进程的worker进程,用于处理新的用户请求;而4852,旧版本的master进程,4853,所属master的worker进程则处理当前正在处理的用户的请求,不再接受新的用户请求。

之前访问过Nginx服务器的主机
Nginx的平滑升级及版本回退,日志切割
未访问Nginx服务器的主机
Nginx的平滑升级及版本回退,日志切割

原有进程处理完所有请求,关闭所有连接后,停止

ps -ef | grep nginx
kill -WINCH 4852
ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割
Nginx的平滑升级及版本回退,日志切割
注意:kill -WINCH 只会杀掉旧版本master进程的worker进程,不会杀掉master进程。等更新完毕后,可以杀死旧版本的master进程,平滑升级完成。

四、版本回退

我们再实际生产环境当中,如果升级失败,则需要再第一时间,版本回退!!!

1.将备份好的旧版本的脚本还原

[[email protected] sbin]# pwd
/usr/local/nginx/sbin
[[email protected] sbin]# ls
nginx  nginx.old
[[email protected] sbin]# cp -f nginx.old nginx
cp: overwrite ‘nginx’? y
[[email protected] sbin]# ls
nginx  nginx.old
[[email protected] sbin]# ./nginx -V
nginx version: nginx/1.15.8
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-file-aio

Nginx的平滑升级及版本回退,日志切割

2.唤醒旧版本的master进程,使之产生新的worker进程

ps -ef | grep nginx
kill -HUP 4852		#唤醒旧版本的master进程,使之产生新的worker进程
ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割

3.使回退版本的worker进程接收新的用户请求。同时新版本的master进程的worker进程不再接收新的用户请求,只处理当前的用户请求

ps -ef | grep nginx
kill -USR2 7681
ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割

4.关闭新版本master进程的两个worker进程

ps -ef | grep nginx
kill -WINCH 7681
ps -ef | grep nginx

Nginx的平滑升级及版本回退,日志切割
现在工作的进程为旧版本的Nginx的服务,杀掉新版本的master进程后,则版本回退完毕。

五、nginx日志切割

我们再日常的生产环境当中,日志文件的大小可能高达几个G,这对我们的管理造成很大的不变。我们需要日志切割将每天的日志定期备份,并且新的日志产生再新的日志文件,方便日志的管理。

这就是日志切割!!!

1、创建每天日志切割后存放目录

[[email protected] logs]# pwd
/usr/local/nginx/logs
[[email protected] logs]# mkdir oldlogs
[[email protected] logs]# ls
access.log  error.log  nginx.pid  nginx.pid.oldbin  oldlogs

Nginx的平滑升级及版本回退,日志切割

2、编写日志切割脚本

[[email protected] logs]# vim /usr/local/nginx/logs/backup.sh
===============================================================
#!/bin/bash

LOG_PATH=/usr/local/nginx/logs/oldlogs		##定义切割日志后存放的路径变量
CUR_LOG_PATH=/usr/local/nginx/logs			##定义nginx日志存放的路径变量
YESTERDAY=$(date +%F -d -1day)				##定义昨天的日期变量

mv $CUR_LOG_PATH/access.log $LOG_PATH/${YESTERDAY}_access.log	##将昨天的access日志文件移动到切割目录,并且重命名
mv $CUR_LOG_PATH/error.log $LOG_PATH/${YESTERDAY}_error.log   	##将昨天的error日志文件移动到切割目录,并且重命名

kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)			##告诉nginx产生新的日志文件,用来存放日志

Nginx的平滑升级及版本回退,日志切割

3、制作定时任务,定时nginx日志切割

[[email protected] logs]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[[email protected] logs]# crontab -l
0 0 * * * /bin/bash /usr/local/nginx/logs/backup.sh		#每天的00:00进行日志切割

Nginx的平滑升级及版本回退,日志切割
日志切割的任务部署完成。关于Nginx的部分操作就是这些,我们下次再见!

相关文章: