nginx===》nginx平滑升级(1.16.2--1.20.2)

Posted 一夜暴富--gogogo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx===》nginx平滑升级(1.16.2--1.20.2)相关的知识,希望对你有一定的参考价值。

一、原理

nginx方便地帮助我们实现了平滑升级。其原理简单概括,就是:

(1)在不停掉老进程的情况下,启动新进程。
(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
(3)新进程接受新请求。
(4)老进程处理完所有请求,关闭所有连接后,停止。

nginx平滑升级原理

(1): 多进程模式下的请求分配方式:

Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。

(2):信号的接受和处理:

nginx主进程在启动完成后会进入等待状态,负责影响各类系统,如:SIGCHLD,SIGHUP,SIGUSR2.

(3):Nginx信号介绍:

《1》:主进程支持的信号
TERM,INT: 立刻推出
QUIT: 等待工作进程结束后再推出
KILL: 强制终止进程
HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程
USR1: 重新打开日志文件
USR2: 启动新的主进程,实现热升级
WINCH: 逐步关闭工作进程

《2》:工作进程支持的信号
TERM,INT: 立刻退出
QUIT: 等待请求处理结束后再退出
USR1: 重新打开日志文件
(注:nginx主要玩的是信号,nginx有两种进程,一种是主进程,一种是工作进程,当在启动服务的时候,他首先会出现主进程,主进程启动之后去加载配置文件,绑定端口等,然后主进程派送工作进程,工作进程上会持有工作描述符,然后在描述符上添加监听事件来接受请求然后去处理请求。)

二、操作

2.1查看Nginx版本及编译参保存,编译新版本的时候会用到

[root@jac-ota-test-dmz jacadmin]# nginx -V
nginx version: nginx/1.16.2
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=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe-Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

2.2下载Nginx新本版

http://nginx.org/en/download.html

cd /opt

wget http://nginx.org/download/nginx-1.20.2.tar.gz

2.3解压,,编译,编译过程可能需要安装依赖,提示缺少就安装

tar xvf nginx-1.20.2.tar.gz

cd nginx-1.20.2/

./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

make

2.4执行完成之后,不需要make install ,备份原来的二进制启动文件,然后将新版的启动文件拷贝过去

mv /usr/sbin/nginx /usr/sbin/nginx.bak

cp /opt/nginx-1.20.2/objs/nginx  /usr/sbin/

2.5备份一下Nginx全目录

cp /etc/nginx /etc/nginx.bak

2.6测试一下复制过来的文件是否生效

/usr/sbin/nginx -t -c /etc/nginx/conf.d/nginx.conf

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful\\

2.7发送USR2信号给nginx master 进程

(nginx服务接收到USR2信号后,首先会将旧的nginx.pid文件添加后缀.oldbin,变为nginx.pid.oldbin,然后执行新版本的二进制文件启动服务,如果新的服务启动成功,系统中将有新旧两个Nginx服务共同提供web服务)

cat /run/nginx.pid

 ps -ef |grep nginx

kill -USR2 `cat /run/nginx.pid`

2.8此时会出现两个master进程

ps -ef | grep nginx
root   22644   1 0 23:30 ?    00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www   22648 22644 0 23:30 ?    00:00:00 nginx: worker process  
root   25784 22644 0 23:47 ?    00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www   25789 25784 0 23:47 ?    00:00:00 nginx: worker process 、

2.9通过发送WINCH信号(平缓停止worker process)和QUIT信号(平缓停止Nginx服务)停止旧的Nginx服务进程

kill -WINCH `cat /run/nginx.pid.oldbin`
kill -QUIT `cat /run/nginx.pid.oldbin`

完成后在Nginx -v查看版本

以上是关于nginx===》nginx平滑升级(1.16.2--1.20.2)的主要内容,如果未能解决你的问题,请参考以下文章

nginx===》nginx平滑升级(1.16.2--1.20.2)

Nginx 平滑升级(不需要关闭Nginx升级)

Nginx平滑升级版本!

Nginx平滑升级

Nginx平滑升级

nginx的平滑升级