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主进程了