一、示例环境说明
操作系统: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。
2、使用nginx –v查看当前nginx版本
3、执行yum upgrade nginx命令升级nginx至最新版本
4、检查升级后的nginx版本
5、检查nginx配置,检查通过后执行nginx优雅重启
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
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、其他报错
一般报错根据报错提示处理及可解决,有疑问着百度错误内容一般均可以找到解决方法。