热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
优点嘛,就是可以在不间断提供服务的情况下进行软件的升级操作,不影响服务正常运行。
可以通过控制信号来对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 |
平滑升级
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。
安装依赖包
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
解压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已经是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