本文转载于https://www.cnblogs.com/liuqiang0/p/8528009.html
一、关于nginx平滑升级
保持nginx线上业务稳定,对nginx的版本号进行升级
二、nginx平滑升级原理
多进程模式下的请求分配方式
Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。
信号的接收和处理
Nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。
Nginx信号简介
主进程master支持的信号
TERM, INT: 立刻退出
QUIT: 等待工作进程结束后再退出
KILL: 强制终止进程
HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
USR1: 重新打开日志文件
USR2: 启动新的主进程,实现热升级
WINCH: 逐步关闭工作进程
工作进程支持的信号
TERM, INT: 立刻退出
QUIT: 等待请求处理结束后再退出
USR1: 重新打开日志文件
三、nginx平滑升级实战
1、查看现有nginx的版本及编译参数:
[root@nginx app]# ./nginx/sbin/nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/app/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
2、查看进程:
[root@nginx app]# ps aux|grep nginx
root 20971 0.0 0.0 45848 1124 ? Ss 10:56 0:00 nginx: master process ./nginx/sbin/nginx
nginx 20972 0.0 0.1 48376 1968 ? S 10:56 0:00 nginx: worker process
3、备份旧版本nginx二进制文件
[root@nginx app]# cp nginx/sbin/nginx nginx/sbin/nginx.bak
[root@nginx app]# cp nginx/conf/nginx.conf nginx/conf/nginx.conf.bak
4、下载所需nginx版本,并进行编译安装(编译参数需与旧版本一致)
[root@nginx src]# tar zxf nginx-1.14.0.tar.gz
[root@nginx src]# cd nginx-1.14.0/
[root@nginx nginx-1.14.0]# ./configure --prefix=/app/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
[root@nginx nginx-1.14.0]# make && make install
5、发送USR2信号
向主进程发送USR2信号,nginx会启动一个新版本的master进程和子进程,和旧版本一起处理请求
[root@nginx app]# kill -USR2 20971
[root@nginx app]# ps aux|grep nginx
root 20971 0.0 0.0 45848 1320 ? Ss 10:56 0:00 nginx: master process ./nginx/sbin/nginx
nginx 20972 25.3 0.1 48376 2220 ? S 10:56 2:53 nginx: worker process
root 24229 0.0 0.1 45852 3144 ? S 11:07 0:00 nginx: master process ./nginx/sbin/nginx
nginx 24230 0.0 0.1 48376 1960 ? S 11:07 0:00 nginx: worker process
此时旧版本的pid文件名被旧版本的master重命名为nginx.pid.oldbin
[root@nginx app]# ls nginx/logs/
access.log error.log nginx.pid nginx.pid.oldbin
6、关闭旧版本子进程
此时,新旧两个版本的nginx进程都在运行中(默认,新版本的nginx在安装后就自动运行。)此时运行 kill -WINCH 【老版本的Nginx主进程号】 使老版本的nginx 的worker process 逐步结束;
[root@nginx app]# kill -WINCH 20971
[root@nginx app]# ps aux|grep nginx
root 20971 0.0 0.0 45848 1320 ? Ss 10:56 0:00 nginx: master process ./nginx/sbin/nginx
root 24229 0.0 0.1 45852 3144 ? S 11:07 0:00 nginx: master process ./nginx/sbin/nginx
nginx 24230 0.0 0.1 48376 1960 ? S 11:07 0:00 nginx: worker process
7、关闭旧版本主进程
待所有旧版本的worker process全部退出,仅由新的工作进程来处理输入的请求了。 使用kill -QUIT 14859 【老版本的Nginx主进程号】 从容关闭旧版本master(主进程号)。完成版本升级。
[root@nginx app]# kill -QUIT 20971
[root@nginx app]# ps aux|grep nginx
root 24229 0.0 0.1 45852 3144 ? S 11:07 0:00 nginx: master process ./nginx/sbin/nginx
nginx 24230 0.0 0.1 48376 1960 ? S 11:07 0:00 nginx: worker process
8、查看nginx版本,验证nginx平滑升级是否成功
[root@nginx nginx]# ./sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/app/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
nginx成功从1.10.3版本升级为1.14.0版本