本文转载于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版本