nginx 热部署

nginx作为一个优秀的web服务器,优秀的反向代理服务器,并且nginx也支持高可用的特性,

nginx还支持热部署的特点。

热部署的特点 :再不重启或者关闭进程的情况下,新的应用直接替换旧的应用

更换nginx的二进制命令版本

热部署大致流程

1.备份旧的程序  二进制文件  备份nginx命令,/opt/nginx1.8/sbin/nginx

2.编译安装新的二进制文件,覆盖旧的二进制文件 (再装一个版本的nginx,且替换旧的nginx命令)

3.发送USR2信号发给旧的master进程

4.发送WINCH信号给旧的master进程

5.发送QUIT信号给旧的master进程

环境准备

准备旧的nginx程序版本

[root@localhost ~]# nginx -v
nginx version: nginx/1.18.0

准备一个新的nginx程序版本

wget   https://nginx.org/download/nginx-1.20.1.tar.gz

nginx热部署操作

nginx工作模式是master-worker(包工头---干活工人)

nginx支持reload重载,仅仅是nginx的master进程,在检查配置文件正确之后,正确则更新,

错误则返回异常,正确的情况下也不会更改已经建立的worker,只会等待worker处理完毕请求之后,杀死旧的worker,

然后再从新的配置文件中,运行新的worker(一旦更换了新的配置文件,reload master 主进程,那么手底下的工人也就会被换一批了)

nginx热部署功能,在不影响用户提体验下,进行软件版本升级,也就是不主动的杀死worker,就能够更换软件的二进制命令

查看当前机器环境的nginx版本

[root@localhost ~]# nginx -v
nginx version: nginx/1.18.0

备份旧的目录

[root@localhost sbin]# mv nginx nginx1.8

检查旧的二进制命令的编译参数

[root@localhost sbin]# nginx1.8 -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx1.8 --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio

下载编译安装新版本的nginx

wget   https://nginx.org/download/nginx-1.20.1.tar.gz 

tar  -zxvf nginx-1.20.1.tar.gz

进行编译安装 

cd nginx-1.2.0.1

新版本的nginx编译参数和旧的保持一致

./configure   --prefix=/opt/nginx1.8 --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio

编译三部曲 后两部

make   

make  install   或者  make && make install

检查新版的nginx信息,发现此时已经有2个版本的nginx命令

[root@localhost nginx1.8]# cd sbin/

[root@localhost sbin]# ls
nginx nginx1.8
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.20.1

再次检查当前系统的nginx状态

root 5959 1 0 15:56 ? 00:00:00 nginx: master process nginx1.8
www 5960 5959 0 15:56 ? 00:00:00 nginx: worker process
www 5961 5959 0 15:56 ? 00:00:00 nginx: worker process

通过pid  ppid可以验证,worker  process是由master  process创建的

此时发送一个USR2信号给  旧的master  process,作用是使得ngixn旧的版本停止接收用户请求,

并且切换为新的nginx版本

执行如下命令,给旧的nginx发送信号

kill -USR2  `cat  /opt/nginx1.8/logs/nginx.pid`

当执行完毕上述的命令,ningx-master旧的,首先会重命名它的pid文件

然后添加上.oldbin后缀,然后会在启动一个新的master主进程,以及worker,

使用的是新版本的nginx二进制命令,此时新的nginx就能够自动的接收用户发来的请求,

过度到新的nginx-worker工作进程上,因此实现了一个平滑过度

此时再次检查新的nginx进程状态

[root@localhost sbin]# ps -ef |grep nginx
root 5959 1 0 15:56 ? 00:00:00 nginx: master process nginx1.8
www 5960 5959 0 15:56 ? 00:00:00 nginx: worker process
www 5961 5959 0 15:56 ? 00:00:00 nginx: worker process
root 5963 5959 0 15:56 ? 00:00:00 nginx: master process nginx1.8
www 5964 5963 0 15:56 ? 00:00:00 nginx: worker process
www 5965 5963 0 15:56 ? 00:00:00 nginx: worker process
root 5969 2517 0 15:56 pts/0 00:00:00 grep --color=auto nginx

再检查一下,新的pid文件信息

[root@localhost nginx1.8]# cd logs/
[root@localhost logs]# ls
access.log error.log nginx.pid nginx.pid.oldbin
[root@localhost logs]# cat nginx.pid.oldbin
5959
[root@localhost logs]# cat nginx.pid
5963

此时发送WINCH信号,给旧的master进程,让旧的master进程优雅的退出

kill -WINCH  `cat  /opt/nginx1.8/logs/nginx.pid.oldbin`

此时nginx服务一切正常,就可以干掉旧的master主进程了

posted on 2021-07-28 16:10  sprr  阅读(511)  评论(0编辑  收藏  举报