一、示例环境说明

操作系统:CentOS Linux release 7.6.1810 (Core)

Nginx源码升级前版本:nginx1.12.2

Nginx源码升级后版本:nginx1.19.4

Nginx YUM升级前版本:nginx1.14.2

Nginx YUM升级后版本: nginx1.18.0

 

二、升级方式

  • YUM upgrade升级:本方式适用于使用rpm安装nginx的方式,优点是升级操作简单便捷,缺点是无法升级到指定版本,默认升级至YUM安装支持的最新版本,当前最新版本为nginx1.18.0。
  • 源码平滑升级升级:本方式适用于使用源码安装nginx的方式,通过替换nginx二进制文件完成升级,原理就是Ngnix中的进程分为两类,一类是master进程(主进程),一类是worker进程(工作进程),首先我们先会替换master进程,同时我们替换的master是与老版本的worker兼容的。下一步,就是保持还有连接的worker进程,待其老去退休,进行替换。

 

三、YUM upgrade升级

1、查看最新版本

访问http://nginx.org/packages/centos/7/x86_64/RPMS/ nginx yum安装连接查看此方式的最新版本是否满足需求。当前最新版本为nginx-1.8.0-1.el7.ngx.x86_64.rpm。

centOs 升级nginx nginx 版本升级_服务器

 

2、使用nginx –v查看当前nginx版本

centOs 升级nginx nginx 版本升级_nginx_02

 

3、执行yum upgrade nginx命令升级nginx至最新版本

centOs 升级nginx nginx 版本升级_服务器_03

 

4、检查升级后的nginx版本

centOs 升级nginx nginx 版本升级_nginx_04

 

5、检查nginx配置,检查通过后执行nginx优雅重启

centOs 升级nginx nginx 版本升级_服务器_05

 

6、升级完成

 

四、源码平滑升级升级

 

1、源码平滑升级原理

多进程模式下的请求分配方式,Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。 信号的接收和处理,Nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。

Nginx信号简介

主进程支持的信号

TERM, INT: 立刻退出

QUIT: 等待工作进程结束后再退出

KILL: 强制终止进程

HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。

USR1: 重新打开日志文件

USR2: 启动新的主进程,实现热升级

WINCH: 逐步关闭工作进程

工作进程支持的信号

TERM, INT: 立刻退出

QUIT: 等待请求处理结束后再退出

USR1: 重新打开日志文件

 

2、查看当前nginx版本及编译参数

#nginx -V

centOs 升级nginx nginx 版本升级_centOs 升级nginx_06

3、官方下载最新源码

# wget http://nginx.org/download/nginx-1.19.4.tar.gz

4、解压软件包

# tar xf nginx-1.19.4.tar.gz -C /usr/local/src

5、编译软件包

# cd /usr/local/src/nginx-1.19.4

说明:编译参数与原版本保持一致

# ./configure --prefix=/etc/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 --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
#make

7、备份二进制文件,用新版本的替换

#cd /usr/sbin/
# mv nginx nginx.old
# cp -f /opt/soft/nginx-1.19.4/objs/nginx ./

8、检查nginx配置

# nginx –t

9、发送USR2信号

向主进程(master)发送USR2信号,Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求。

[root@wuhs nginx-1.19.4]# ps -ef |grep nginx
root     23094     1  0 Nov06 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    23095 23094  0 Nov06 ?        00:00:01 nginx: worker process                   
nginx    23096 23094  0 Nov06 ?        00:00:00 nginx: worker process                   
nginx    23097 23094  0 Nov06 ?        00:00:03 nginx: worker process  
# kill -USR2 23094

10、发送WINCH信号

向旧的Nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理。

# kill -WINCH 23094

11、发送QUIT信号

升级完毕,可向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出

# kill -QUIT 23094

12、nginx版本检查

[root@wuhs nginx-1.19.4]# nginx -v
nginx version: nginx/1.19.4

13、回滚步骤,发送HUP信号

如果这时需要回退继续使用旧版本,先进入/usr/sbin目录,替换回原理的nginx可执行文件,然后可向旧的Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)。

# mv nginx.old nginx
# kill -HUP 16396

 

五、QA

1、编译nginx 时报错

/configure: error: the HTTP XSLT module requires the libxml2/libxslt
解:
yum -y install libxml2 libxml2-dev
 yum -y install libxslt-devel

2、编译安装nginx的时候–with-http_perl_module 这个参数,编译时出现如下错误:error: perl module ExtUtils::Embed is required

解:

yum -y install perl-devel perl-ExtUtils-Embed

3、缺少Google perftool库报错

./configure: error: the Google perftools module requires the Google perftools
library. You can either do not enable the module or install the library.

解:

Centos7 64位下 直接使用yum安装
#yum install –y gperftools

4、执行nginx配置检查时报错

nginx 报错 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead

解:

配置文件配置错误,1.15 及以后的版本,不需要再写 ssl on,删除ssl on,改为listen 443 ssl;

5、其他报错

一般报错根据报错提示处理及可解决,有疑问着百度错误内容一般均可以找到解决方法。