nginx作为一个优秀的web服务器,优秀的反向代理服务器,并且nginx也支持高可用的特性,nginx还支持热部署的特点
热部署的特点:在不重启或者关闭进程的情况下,新的应用直接替换旧的应用
更好nginx的二进制命令版本
热部署大致流程
1、备份旧的程序 二进制文件 备份nginx命令 /opt/tngx232/sbin/nginx
2、编译安装新的二进制文件,覆盖旧的二进制文件(再装一个版本的nginx,且替换旧的nginx命令)
3、发送USR2信号给旧的master进程
4、发送WINCH信号给旧的master进程
5、发送QUIT信号给旧的master进程
环境准备工作
1、准备旧的nginx程序版本
[root@yuweijie conf]# nginx -v
Tengine version: Tengine/2.3.3
nginx version: nginx/1.18.0
2、准备一个新的nginx程序版本
wget http://tengine.taobao.org/download/tengine-2.2.0.tar.gz
nginx热部署操作
nginx工作模式是master-worker(包工头--干活工人)
刚才所说的nginx支持reload重载,仅仅是nginx的master进程,在检查配置文件正确之后,正确则更新,错误则返回异常,正确的情况下也不会更改已经建立的worker,只会等待worker处理完毕请求之后,杀死旧的worker,然后再从新的配置文件中,运行出新的worker(一旦更换了配置文件,reload master主进程,那么手底下的工人也就会被换一批)
nginx还提供了热部署的功能,特点是:在不影响用户体验下,进行软件版本升级,也就是不主动的杀死worker,就能够更好软件的二进制命令
1、检查当前机器环境的nginx版本
[root@yuweijie conf]# nginx -v
Tengine version: Tengine/2.3.3
nginx version: nginx/1.18.0
2、备份旧的二进制命令
/opt/tngx232/sbin 进入该目录,对nginx进行备份
mv nginx nginx.232
3、检查旧的二进制命令的编译参数
[root@yuweijie sbin]# nginx.232 -V
Tengine version: Tengine/2.3.3
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/tngx232 --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio
4、下载编译安装新版本的nginx
wget http://tengine.taobao.org/download/tengine-2.2.0.tar.gz
wget http://tengine.taobao.org/download/tengine-2.3.3.tar.gz
tar -zxvf tengine-2.2.0.tar.gz
进行编译安装
cd tengine-2.2.0
新版本的nginx编译参数和旧的保持一致
./configure --prefix=/opt/tngx232 --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
5、检查一下新版的nginx信息,发现此时已经有2个版本的nginx命令
进入/opt/tngx232/sbin
[root@yuweijie sbin]# ./nginx -v
Tengine version: Tengine/2.2.0 (nginx/1.8.1)
[root@yuweijie sbin]# ./nginx.232 -v
Tengine version: Tengine/2.3.3
nginx version: nginx/1.18.0
6、再次检查当前系统的nginx状态
通过pid ppid可以验证,worker process 是由 master process 创建的
[root@yuweijie sbin]# ps -ef | grep nginx
root 8975 1 0 05:41 ? 00:00:00 nginx: master process /opt/tngx232/sbin/nginx
root 8976 8975 0 05:41 ? 00:00:00 nginx: worker process
root 8977 8975 0 05:41 ? 00:00:00 nginx: worker process
root 11841 1981 0 05:44 pts/0 00:00:00 grep --color=auto nginx
worker process的父进程号和master process的进程号一致
7、此时发生一个USR2信号给旧的master process,作用是使得nginx旧的版本停止接收用户请求,并且切换为新的nginx版本
cat /opt/tngx232/logs/nginx.pid
执行如下命令,给旧的nginx发送信号
kill -USR2 `cat /opt/tngx232/logs/nginx.pid`
当执行完毕上述的命令之后,旧的nginx-master首先会重命名它的pid文件,然后添加上.oldbin后缀,然后会再启动一个新的master主进程,以及worker进程,使用的是新版本的nginx二进制命令,此时新的nginx就能够自动的接收用户发来的请求,过渡到新的nginx-worker工作进程上,因此实现了一个平滑过渡
8、此时再次检查新的nginx进程状态
[root@yuweijie sbin]# ps -ef | grep nginx
root 8975 1 0 05:41 ? 00:00:00 nginx: master process /opt/tngx232/sbin/nginx
root 8976 8975 0 05:41 ? 00:00:00 nginx: worker process
root 8977 8975 0 05:41 ? 00:00:00 nginx: worker process
root 11844 8975 0 05:45 ? 00:00:00 nginx: master process /opt/tngx232/sbin/nginx
root 11845 11844 0 05:45 ? 00:00:00 nginx: worker process
root 11846 11844 0 05:45 ? 00:00:00 nginx: worker process
root 11848 1981 0 05:45 pts/0 00:00:00 grep --color=auto nginx
9、此时发送WINCH信号,给旧的master进程,让旧的master进程优雅的退出
kill -WINCH `cat /opt/tngx232/logs/nginx.pid.oldbin`
[root@yuweijie sbin]# ps -ef | grep nginx
root 8975 1 0 05:41 ? 00:00:00 nginx: master process /opt/tngx232/sbin/nginx
root 11844 8975 0 05:45 ? 00:00:00 nginx: master process /opt/tngx232/sbin/nginx
root 11845 11844 0 05:45 ? 00:00:00 nginx: worker process
root 11846 11844 0 05:45 ? 00:00:00 nginx: worker process
root 11851 1981 0 05:46 pts/0 00:00:00 grep --color=auto nginx
10、此时如果你觉得nginx服务一切正常,就可以干掉旧的master主进程
kill 8975
网友评论