前言
在不停老进程的情况下,启动新进程;
老进程负责处理仍然没有处理完的请求,但不再接受处理请求;
新进程接受新请求;
老进程处理完所有请求,关闭所有连接后,停止。
这样就很方便地实现了平滑升级。
一般有两种情况下需要升级Nginx,一种是存在安全漏洞确实要升级Nginx的版本,另一种是要为Nginx添加新的模块。
案例版本介绍
系统版本:centos7.9
旧版本:nginx-1.18.0
新版本:nginx-1.21.6
虚拟机环境下,Nginx平滑升级
准备工作
找到旧版本安装目录,并且查看目前安装了哪些模块,得到编译参数
1 2 3 4
| [root@nginx ~]# ps -ef | grep nginx root 13818 1 0 05:58 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 13819 13818 0 05:58 ? 00:00:00 nginx: worker process root 13818 13868 0 06:01 pts/0 00:00:00 grep --color auto nginx
|
1 2 3 4 5 6
| [root@nginx~]# /usr/local/nginx/sbin/nginx -V nginx version:nginx/1.18.0 built by gcc 4.8.5 20150623(Red Hat4.8.5-44)(GCC) built with 0penssL 1.0.2k-fips 26 Jan2017 TLS SNI support enabled confiqure arquments:--pretix=/usr/local/nginx --error-loq-path=/var/log/nqinx/error.loq--http-loa-path=/var/loa/nginx/acce ss.log--with-http gzip static module--http-client-body-temp-path=/var/temp/nginx client--http-proxy-temp-path=/var/temp/nginx/proxy--http-fastcqi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp- path=/var/temp/nginx/uwsgi--http-scgi-temp-path=/var/temp/nginx/scgi--with-http s sl_module --with-http gzip static_module --with-stream
|
下载新版本后,并编译不安装
1 2 3 4 5 6 7 8
| cd /tmp wget https://nginx.org/download/nginx-1.21.6.tar.gz tar -zxf nginx-1.21.6.tar.gz cd nginx-1.21.6 # 编译时加入之前查询到的编译参数结果 ./configure --prefix=/usr/local/nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --with-http_ssl_module --with-http_gzip_static_module --with-stream # 进行编译,不安装!不安装!不安装! make
|
开始升级
1、备份安装目录下的nginx
1 2
| cd /usr/local/nginx/sbin mv nginx nginx.bak
|
2、复制objs目录下的nginx到当前sbin目录下
1 2
| mv -R /tmp/nginx1.21.6/objs/nginx /usr/local/nginx/sbin/ #建议用mv命令。用cp命令,大概率出现“文件忙”的情况
|
3、检测配置文件是否正确
1
| /usr/local/nginx/sbin/nginx -t
|
4、执行make upgrade
5、执行完后验证升级是否成功
1
| /usr/local/nginx/sbin/nginx -V
|
Docker环境下,Nginx平滑升级
进入安装有nginx的docker容器
1
| [root@localhost ~]# docker exec -it nginx bash
|
查看当前nginx版本
1 2
| [root@bty6dsg053345 /]# nginx -v nginx version: nginx/1.18.0
|
备份当前nginx文件。注意自己安装路径
1
| [root@bty6dsg053345 /]# mv /usr/sbin/nginx /usr/sbin/nginx.bk
|
使用wget https://nginx.org/download/nginx-1.21.6.tar.gz
把最新稳定版本下载下来,或者自己下载后传到服务器再使用docker cp到容器
1 2 3 4 5 6 7 8 9
| [root@bty6dsg053345 /]# wget https://nginx.org/download/nginx-1.21.6.tar.gz --2022-11-04 13:25:01-- https://nginx.org/download/nginx-1.21.6.tar.gz 正在解析主机 nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5702::6, ... 正在连接 nginx.org (nginx.org)|52.58.199.22|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:1062124 (1.0M) [application/octet-stream] 正在保存至: “nginx-1.21.6.tar.gz” 100%[=======================================================================================================================================================================================================>] 1,062,124 766KB/s 用时 1.4s 2021-12-07 17:21:03 (766 KB/s) - 已保存 “nginx-1.21.6.tar.gz” [1062124/1062124])
|
解压
1
| [root@bty6dsg053345 /]# tar xf nginx-1.21.6.tar.gz
|
进入 nginx-1.21.6
1
| [root@bty6dsg053345 /]# cd nginx-1.21.6
|
注意#编译选项与旧版本的编译选项要一致,可以先用nginx -V 查看编译选项
1 2 3 4 5 6
| [root@bty6dsg053345 nginx-1.21.6]# nginx -V nginx version: nginx/1.21.6 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --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
|
编译时加入之前查询到的编译参数结果
1 2 3
| [root@bty6dsg053345 nginx-1.21.6]./configure --prefix=/usr/sbin/nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --with-http_ssl_module --with-http_gzip_static_module --with-stream # 进行编译,不安装!不安装!不安装! [root@bty6dsg053345 nginx-1.21.6] # make
|
上述完成以后,会在当前路径下的objs下面产生一个nginx
1
| [root@bty6dsg053345 nginx-1.21.6]# cd objs/
|
复制objs目录下的nginx到当前sbin目录下
1 2 3
| [root@bty6dsg053345 objs]# mv nginx /usr/sbin/ [root@bty6dsg053345 objs]# nginx -v nginx version: nginx/1.21.6
|
重启docker容器,重新启动nginx。