计算机网络/计算机科学与应用/系统/运维/开发

Nginx 热部署的详细操作过程

一、Nginx热部署

热部署,简单讲就是在不影响业务的情况下,对Nginx版本进行升级等操作,在不影响用户体验的情况下,进行软件版本升级或者回退,不主动杀死worker


  1、检查当前的nginx进程

# ps -ef | grep nginx


  2、修改nginx.conf 修改配置参数

# vim /usr/local/nginx/conf/nginx.conf


  3、重新加载nginx配置

# nginx -s reload


  二、Nginx-master信号传递

1、master进程是不处理请求的,而是分配请求给worker进程,主进程负责重启、热加载、热部署等
2、master是根据nginx.conf 中worker_process 定义启动时创建的工作进程数
3、当worker运行后,master就处于一个等待的状态,等待用户的请求来临,或者系统信号
4、系统管理员可以发送kill指令 或者nginx -s 信号,这样的形式操控nginx


  Nginx信号含义:

  nginx -s  对应的信号功能如下

  参数    信号    含义
  stop   TERM    强制关闭nginx服务
  null   INT      强制关闭整个nginx服务
  quit   QUIT    优雅关闭整个服务
  reopen USR1     重新打开日志记录
  reload  HUB    重新读取配置文件,并且优雅退出旧的worker


三、Nginx 热部署功能操作流程

在不重启或者关闭进程的情况下,新的应用直接替换旧的应用,更换nginx的二进制命令版本


操作过程:

  1、备份旧的程序  二进制文件 备份nginx 命令 /usr/local/nginx/
  2、编译安装新的二进制文件,覆盖旧的二进制文件,在装一个版本的nginx 且替换旧的nginx命令
  3、发送USR2信号发给旧的master进程
  4、发送WINCH信号给旧的master信号
  5、发送QUIT信号给master进程


  1、查看旧的nginx程序版本

[root@VM-4-2-centos logs]# nginx -v
nginx version: nginx/1.21.6


  2、准备一个新的nginx 

# wget https://nginx.org/download/nginx-1.20.2.tar.gz


Nginx 热部署操作

Nginx工作模式 是master-worker 


1、检查当前机器版本

[root@VM-4-2-centos logs]# nginx -v
nginx version: nginx/1.21.6


2、备份旧的二进制命令

[root@VM-4-2-centos sbin]# mv nginx nginx.232


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

root@VM-4-2-centos sbin]# ./nginx.232 -V
nginx version: nginx/1.21.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx


4、下载编译安装新版本的Nginx

# wget https://nginx.org/download/nginx-1.20.2.tar.gz
# tar -zxvf nginx-1.20.2.tar.gz
# cd nginx-1.20.2

新版本的nginx编译参数和旧版本的完全一致

./configure --prefix=/usr/local/nginx --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


5、检查新版Nginx信息

此时有2个版本的nginx

[root@VM-4-2-centos sbin]# pwd
/usr/local/nginx/sbin
[root@VM-4-2-centos sbin]# ll
total 9688
-rwxr-xr-x 1 root root 6023648 Jul 28 16:39 nginx
-rwxr-xr-x 1 root root 3892008 Jun 11 16:02 nginx.232

[root@VM-4-2-centos sbin]# ./nginx -v
nginx version: nginx/1.20.2
[root@VM-4-2-centos sbin]# ./nginx.232 -v
nginx version: nginx/1.21.6

image.png

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

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

[root@VM-4-2-centos sbin]# ps -ef|grep nginx
root      9686     1  0 10:43 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    9687  9686  0 10:43 ?        00:00:00 nginx: worker process


7、此时发送一个USR2信号给旧的master process 使nginx旧版本停止接收用户请求,并且切换新的nginx版本

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

#  kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

当执行完上诉命令,nginx-master 旧的,首先会重命名它的pid文件,然后添加上.oldbin后缀

然后会在启动一个新的master主进程,以及worker,使用新的nginx二进制命令,实现平滑过渡

image.png

8、此时检查新的nginx状态

[root@VM-4-2-centos sbin]# ps -ef|grep nginx
root      9686     1  0 10:43 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    9687  9686  0 10:43 ?        00:00:00 nginx: worker process
root     17599  9686  0 16:45 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   17600 17599  0 16:45 ?        00:00:00 nginx: worker process


在检查新的pid文件信息

[root@VM-4-2-centos sbin]# cd ../logs/
[root@VM-4-2-centos logs]# ls
access.log  error.log  nginx.pid  nginx.pid.oldbin
[root@VM-4-2-centos logs]# cat nginx.pid
17599
[root@VM-4-2-centos logs]# cat nginx.pid.oldbin
9686


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

kill -WINCH  `cat /usr/local/nginx/logs/nginx.pid.oldbin`
[root@VM-4-2-centos logs]# ps -ef|grep nginx
root      9686     1  0 10:43 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
root     17599  9686  0 16:45 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   17600 17599  0 16:45 ?        00:00:00 nginx: worker process

image.png

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

[root@VM-4-2-centos logs]# kill 9686
[root@VM-4-2-centos logs]# ps -ef|grep nginx
root     17599     1  0 16:45 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   17600 17599  0 16:45 ?        00:00:00 nginx: worker process
root     19859  8079  0 16:57 pts/0    00:00:00 grep --color=auto nginx


Nginx热部署更换完成!


照顾好自己,如果尚有余力,记得保护美好的东西,不畏不惧赤诚善良。

评论

^