在实际的生产环境当中,每分每秒都会有客户在访问我们的nginx服务器。这样,我们就不能直接重启服务或reload重新加载配置,否则会影响客户的访问,甚至导致Nginx服务器崩溃,严重影响用户体验!这就需要将服务平滑升级。
系统环境:RHEL7.3
一、首先需要两个不同版本的Nginx安装包
[root@server1 ~]# ls
nginx-1.15.8.tar.gz nginx-1.16.0.tar.gz
二、先安装nginx-1.15.8
1.解压源码包
[root@server1 ~]# tar zxf nginx-1.15.8.tar.gz
2.为Nginx添加语法检测(方便编写配置文件,减少出错率)
mkdir ~/.vim
cd nginx-1.16.0/contrib/
cp -r vim/* ~/.vim/
3.修改编译配置文件,使其不debug
vim auto/cc/gcc
====================
171 # debug
172 #CFLAGS="$CFLAGS -g"
4.解决编译依赖,并配置
yum install -y pcre-devel zlib-devel gcc
./configure --prefix=/usr/local/nginx --with-file-aio
5.编译安装
make && make install
6.查看Nginx版本
cd /usr/local/nginx/sbin/
./nginx -t
./nginx -V
7.添加Ngnix用户
useradd nginx
8.修改文件系统数目限制
vim /etc/security/limits.conf
=================================
61 # End of file
62 nginx - nofile 65535
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 }
10.开启Nginx服务
./nginx
./nginx -V
三、将nginx-1.15.8平滑升级为nginx-1.16.0
1.解压缩
[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz
[root@server1 ~]# ls
nginx-1.15.8 nginx-1.15.8.tar.gz nginx-1.16.0 nginx-1.16.0.tar.gz
2.配置、编译
[root@server1 ~]# cd nginx-1.16.0/
[root@server1 nginx-1.16.0]# pwd
/root/nginx-1.16.0
[root@server1 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
[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-file-aio
[root@server1 nginx-1.16.0]# make
3.查看新生成的二进制执行文件
[root@server1 nginx-1.16.0]# cd objs/
[root@server1 objs]# ls
autoconf.err nginx ngx_auto_config.h ngx_modules.c src
Makefile nginx.8 ngx_auto_headers.h ngx_modules.o
[root@server1 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
4.备份原有Nginx启动脚本(以防止升级失败无法版本回退)
[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# cp nginx nginx.old
[root@server1 sbin]# ls
nginx nginx.old
5.将新版本的脚本复制到旧版本的脚本目录下
[root@server1 sbin]# cd -
/root/nginx-1.16.0/objs
[root@server1 objs]# cp -f nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
此时/usr/local/nginx/sbin/目录下的nginx为新版本的执行文件,nginx.old为旧版本的二进制执行文件
6.查看Nginx进程号
查看到此时nginx的master进程和worker进程:
ps -ef | grep nginx
客户端查看此时生效的nginx服务器:
此时为nginx/1.15.8生效
7.替换服务
注意:此时4852为旧版本的master进程,4853为所属master的worker进程
ps -ef | grep nginx
kill -USR2 4852
ps -ef | grep nginx
注意:17125为新版本的master进程,17126为所属master进程的worker进程,用于处理新的用户请求;而4852,旧版本的master进程,4853,所属master的worker进程则处理当前正在处理的用户的请求,不再接受新的用户请求。
之前访问过Nginx服务器的主机
未访问Nginx服务器的主机
原有进程处理完所有请求,关闭所有连接后,停止
ps -ef | grep nginx
kill -WINCH 4852
ps -ef | grep nginx
注意:kill -WINCH 只会杀掉旧版本master进程的worker进程,不会杀掉master进程。等更新完毕后,可以杀死旧版本的master进程,平滑升级完成。
四、版本回退
我们再实际生产环境当中,如果升级失败,则需要再第一时间,版本回退!!!
1.将备份好的旧版本的脚本还原
[root@server1 sbin]# pwd
/usr/local/nginx/sbin
[root@server1 sbin]# ls
nginx nginx.old
[root@server1 sbin]# cp -f nginx.old nginx
cp: overwrite ‘nginx’? y
[root@server1 sbin]# ls
nginx nginx.old
[root@server1 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
2.唤醒旧版本的master进程,使之产生新的worker进程
ps -ef | grep nginx
kill -HUP 4852 #唤醒旧版本的master进程,使之产生新的worker进程
ps -ef | grep nginx
3.使回退版本的worker进程接收新的用户请求。同时新版本的master进程的worker进程不再接收新的用户请求,只处理当前的用户请求
ps -ef | grep nginx
kill -USR2 7681
ps -ef | grep nginx
4.关闭新版本master进程的两个worker进程
ps -ef | grep nginx
kill -WINCH 7681
ps -ef | grep nginx
现在工作的进程为旧版本的Nginx的服务,杀掉新版本的master进程后,则版本回退完毕。
五、nginx日志切割
我们再日常的生产环境当中,日志文件的大小可能高达几个G,这对我们的管理造成很大的不变。我们需要日志切割将每天的日志定期备份,并且新的日志产生再新的日志文件,方便日志的管理。
这就是日志切割!!!
1、创建每天日志切割后存放目录
[root@server1 logs]# pwd
/usr/local/nginx/logs
[root@server1 logs]# mkdir oldlogs
[root@server1 logs]# ls
access.log error.log nginx.pid nginx.pid.oldbin oldlogs
2、编写日志切割脚本
[root@server1 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产生新的日志文件,用来存放日志
3、制作定时任务,定时nginx日志切割
[root@server1 logs]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@server1 logs]# crontab -l
0 0 * * * /bin/bash /usr/local/nginx/logs/backup.sh #每天的00:00进行日志切割
日志切割的任务部署完成。关于Nginx的部分操作就是这些,我们下次再见!