nginx平滑升级版本
1:nginx平滑升级的概述:
随着网络并发访问量越来越高,nginx web服务器也越来越流行,nginx版本换代越来越频繁,1.15.2版本的nginx更新了许多新功能,生产环境中版本升级必然的但是线上业务不能停,此时nginx的升级就是运维的重要工作了。
2:nginx平滑升级原理
(1): 多进程模式下的请求分配方式:
Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。
(2):信号的接受和处理:
nginx主进程在启动完成后会进入等待状态,负责影响各类系统,如:SIGCHLD,SIGHUP,SIGUSR2.
(3):Nginx信号介绍:
《1》:主进程支持的信号
- TERM,INT: 立刻推出
- QUIT: 等待工作进程结束后再推出
- KILL: 强制终止进程
- HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程
- USR1: 重新打开日志文件
- USR2: 启动新的主进程,实现热升级
- WINCH: 逐步关闭工作进程
《2》:工作进程支持的信号
- TERM,INT: 立刻退出
- QUIT: 等待请求处理结束后再退出
- USR1: 重新打开日志文件
(注:nginx主要玩的是信号,nginx有两种进程,一种是主进程,一种是工作进程,当在启动服务的时候,他首先会出现主进程,主进程启动之后去加载配置文件,绑定端口等,然后主进程派送工作进程,工作进程上会持有工作描述符,然后在描述符上添加监听事件来接受请求然后去处理请求。)
3:nginx平滑升级实战
《1》:rz 上传
《2》:tar xf nginx-1.15.9.tar.gz -C /usr/src/ 解压
《3》: cd /usr/src/nginx-1.15.9/ 切换目录
《4》:useradd -M -s /sbin/nologin nginx 创建用户
《5》:./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install 编译安装
(注:以上方式是报错
解决方法:
《1》:yum -y install pcre-devel openssl openssl-devel 安装依赖包
))))))
《6》:ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ 创建链接
《7》:vim /usr/local/nginx/conf/nginx.conf 编辑文件
《8》:修改文件
worker_processes 2;
《9》:nginx 启动
《10》:netstat -lnpt |grep 80
《11》:ps aux | grep nginx
(1):查看旧版本nginx的编译参数
《1》: nginx -V 查看编译安装时候的配置项
(2):编译安装新版本nginx源码包,安装路径需要与旧版本一致,(注:不要执行make install 上传源码包不要与老版本差的太大。)
《1》:rz 上传
《2》: tar xf nginx-1.16.0.tar.gz -C /usr/src/ 解压
《3》: cd /usr/src/nginx-1.16.0/ 切换目录
《4》:./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make 编译安装
(3):备份二进制文件,用新版本的替换
《1》:ls 查看,(注:里面有一个objs目录,在objs目录里有一个nginx的主程序。)
《2》: cd /usr/local/nginx/sbin/ 切换目录
《3》:mv nginx nginx.old 修改名称
《4》:ls 查看
《5》:cp /usr/src/nginx-1.16.0/objs/nginx ./ 复制
《6》:./nginx -t 用新程序去加载老文件的语法
(注:不能把老的进程杀死,假如用户在访问资源,这时候不就完了。)
(4):发送USR2信号
向主进程(master)发送usr2信号,nginx会启动一个新的版本的master进程和对应工作进程,和旧版本一起处理请求
《1》:ps aux | grep nginx 查看进程
《2》:kill -USR2 10826 发送信号 (注:这个时候就要看运气了,如果运气不好就不会出现,如果运气好就会有。)
在做一个遍试一试
《1》:rm -rf nginx 删了
《2》:mv nginx.old nginx 修改名
《3》:killall -9 nginx 杀死进程
《4》:nginx 重启
《5》:mv nginx nginx.old 重命名
《6》:mv /usr/src/nginx-1.16.0/objs/nginx ./ 移动
《7》:ps aux |grep nginx 查看进程
《8》:kill -USR2 14234 发送信号
《9》:ps aux |grep nginx 查看进程 (注:此时出现了 许多进程,说明成功。)
《10》:访问(注:这个时候新的和旧的都在发送请求。)
(5)发送WINCH 信号(注:就是让老的工作进程逐步退出。)
向旧的Nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
《1》:kill -WINCH 14234 发送信号
《2》:ps aux |grep nginx 查看进程
注意:回滚步骤,发送HUP信号
如果这时需要回退继续使用旧版本,可向旧的Nginx主进程发送HUP信号,它会重新启动工作进程,仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM 、或者KILL)
《1》:kill -HUP …….
(6):发送OUT 信号
升级完毕,可向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,时旧的主进程退
《1》:kill -QUIT 14234
《2》:ps aux |grep nginx
(7):验证nginx版本号,并访问测试
《1》: nginx -v