Nginx的热部署,也可以说平滑升级与回退

我是顺序

    • 问题:什么是热部署?
    • 问题:Nginx信号控制有哪些?
    • Nginx热部署过程
    • 注意事项
    • 执行流程
      • 安装nginx
      • nginx平滑升级
      • nginx版本回退

Nginx的热部署,也可以说平滑升级与回退_第1张图片

问题:什么是热部署?

热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。

优点嘛,就是可以在不间断提供服务的情况下进行软件的升级操作,不影响服务正常运行。

问题:Nginx信号控制有哪些?

可以通过控制信号来对nginx进行各种操作,但要注意,nginx没有启动的信号,所有信号均需要在启动后进行。

信号 作用
QUIT 平滑关闭,处理完已经接受的请求再关闭, 相当于nginx -s quit
HUP 当配置文件修改时,以新的配置文件开启一个worker进程,并平滑地关闭旧的worker进程,相当于 nginx -s reload
USR1 重读日志,在分割日志时使用,相当于nginx -s reopen
USR2 平滑升级可执行文件(nginx)
WINCH 处理完已经接受的请求再关闭旧进程,配合USR2进行nginx的升级
TERM, INT 不计后果的立刻停止,相当于nginx -s stop

Nginx热部署过程

平滑升级

1、首先把旧的nginx(/usr/local/nginx/sbin/nginx)执行文件进行备份,改名为nginx.old
2、将新版本的nginx解压编译,并将其中objs/nginx代替旧的nginx文件。
3、向旧的master进程发送USR2信号,nginx将会创建新的master进程和新的worker进程。
4、向旧的master进程发送WINCH信号,停止旧的worker进程。

回滚
1、把旧的nginx(nginx.old)执行文件覆盖掉新版本的nginx执行文件。
2、向当前master进程(新版本的master)发送USR2信号,创建一个新的master进程(旧版本的master进程)。
3、向当前master进程(新版本的master)发送WINCH信号,停止当前的worker进程。

注意事项

1、平滑升级时,新版本的nginx千万别make install,这么做会直接覆盖旧版本nginx的全部文件,之前所做的全部配置都将清零。
2、确保创建新的master进程和worker进程后再将旧的进程停止,否则热部署将失去意义。(服务进程都关闭了,又如何在线升级呢)。

nginx的更新很简单,只需要注意以上两点即可。

执行流程

本案例使用的是nginx的1.7和1.8版本,可以从nginx官网下载,网址:http://nginx.org/download/。

ls
nginx-1.8.0.tar.gz nginx-1.7.0.tar.gz

流程:安装nginx1.7==>平滑升级为nginx1.8==>回退到nginx1.7。

安装nginx

安装依赖包

yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel  pcre pcre-devel make automake

安装nginx1.7,因为主要目的是升级与回退,其中的功能模块就最简化了。

tar xf nginx-1.7.0.tar.gz 
cd nginx-1.7.0/
./configure --prefix=/usr/local/nginx 
make ; make install 

启动并测试

/usr/local/nginx/sbin/nginx 
curl 127.0.0.1

查看版本

/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.7.0

nginx平滑升级

解压nginx1.8,并且预编译,编译

tar xf nginx-1.8.0.tar.gz 
cd nginx-1.8.0/
./configure --prefix=/usr/local/nginx
make 

给旧版本的nginx做个备份

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_1.7.old

在当前编译目录下,有个叫做objs的目录,nginx1.8版本的二进制执行文件就在该目录下,只需要将其复制到nginx安装目录/sbin/目录就可以后续操作了

cp -f objs/nginx /usr/local/nginx/sbin/nginx 
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y

查看进程并发送控制信号,使master进程创建新进程,并且不再接收请求。

ps -ef | grep nginx | grep -v grep
root      69821      1  0 20:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    69822  69821  0 20:18 ?        00:00:00 nginx: worker process
kill -USR2 69821 
kill -WINCH 69821 

若不知道那两个控制信号什么意思,可转到上方查看。

这时,我们再次查看nginx的进程,会发现新创建了一个master和worker进程。

ps -ef | grep nginx | grep -v grep
root      69821      1  0 20:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root      72273  69821  0 20:32 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    72274  72273  0 20:32 ?        00:00:00 nginx: worker process

最后来查看我们的nginx版本

/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.8.0

可以看到,版本已经更新了。

nginx版本回退

这个时候,我们的nginx已经是1.8版本的了,通过之前的nginx执行文件备份,可将nginx恢复至旧版本。

cp -f /usr/local/nginx/sbin/nginx_1.7.old /usr/local/nginx/sbin/nginx
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y

重新加载旧版本的master进程

ps -ef | grep nginx | grep -v grep
root      69821      1  0 20:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root      72273  69821  0 20:32 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    72274  72273  0 20:32 ?        00:00:00 nginx: worker process
kill -HUP 69821	#重新唤醒旧master
ps -ef | grep nginx | grep -v grep
root      69821      1  0 20:18 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root      72273  69821  0 20:32 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    72274  72273  0 20:32 ?        00:00:00 nginx: worker process
nobody    72377  69821  0 20:39 ?        00:00:00 nginx: worker process

让新版本的master进程不再接收请求

kill -USR2 72273
kill -WINCH 72273

最后查看版本,验证回退是否成功。

/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.7.0

你可能感兴趣的:(Nginx)