一、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
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二进制命令,实现平滑过渡
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
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热部署更换完成!