已实现本地、测试环境、生成环境的升级。由于环境不同,升级前需要做好充分测试。

升级原因:

发现系统存在Nginx 安全漏洞(CVE-2022-3638)。漏洞描述如下:nginx中发现的该漏洞会影响涉及IPv4连接断开的ngx_resolver.c文件某些未知处理过程,攻击者利用该漏洞在发起远程攻击,导致这个过程中触发内存泄漏。nginx 1.23.2之前版本存在安全漏洞。

平滑升级几种方案:

平滑升级是在不中断服务的情况下进行软件升级或系统更新的一种方式。下面列出几种平滑升级的方案:

  1. 负载均衡器方案:使用负载均衡器将流量逐步从旧版本的服务器切换到新版本的服务器上。在升级前,先将新版本的服务器加入到负载均衡器的服务器池中,并调整新旧版本的权重比例。然后逐渐增加新版本的权重比例,减少旧版本的权重比例,直到最终全部流量都被切换到新版本的服务器上。
  2. 重定向方案:在升级前,在旧版本的服务器中增加一段重定向代码,将请求重定向到新版本的服务器上。在升级完成后,删除旧版本的服务器并删除重定向代码。
  3. 双流量方案:

(1)多端口升级,在新版本的服务器中启动一个新的服务端口,保留旧版本的服务端口不变。在负载均衡器中同时添加新旧版本的服务器,并将新版本的权重比例调整为 0。然后逐渐增加新版本的权重比例,减少旧版本的权重比例,直到最终全部流量都被切换到新版本的服务器上。

(2)"make upgrade" 平滑升级,保持旧版 Nginx 进程不变,新的 Nginx 进程以新版本的二进制文件启动,并将流量平滑地转移到新的进程中。这种方案需要注意的是在升级过程中需要保持配置文件的兼容性,同时还需要保证新版 Nginx 能够顺利启动和运行。


  1. 打补丁:下载需要的补丁,覆盖原文件后,编译

  1. 灰度发布方案:将新版本的代码部署到部分服务器上,并逐步增加流量比例,直到所有服务器都升级完成。

注意,在进行平滑升级前,一定要进行充分的测试和备份工作,以确保升级过程的顺利进行和系统稳定性。

方案3-2:

注:此方案支持绝对路径启动的nginx,如/usr/sbin/nginx,变量nginx直接启动的使用make upgrade平滑升级是不可以的。使用前需要先查看,如下:

[root@dibole ~]# ps -ef | grep nginx
root     36762     1  0 3月13 ?       00:00:00 nginx: master process /usr/sbin/nginx
nobody   36764 36762  0 3月13 ?       00:00:00 nginx: worker process
root     49782 40713  0 18:58 pts/0    00:00:00 grep --color=auto nginx

1、保存老版本的编译配置(nginx -V)、配置文件(nginx.conf)、二进制可执行文件(nginx)

2、下载新版源文件、配置编译文件、编译、覆盖老的nginx二进制文件

3、在老的版本的源文件中,使用新的二进制nginx升级,命令make upgrade

步骤:

1、备份配置文件和nginx的二进制文件

#备份配置文件
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.backup
#备份二进制文件
cp nginx nginx.backup

2、保存老版本的编译配置参数并保存

#查询老版本的配配置***一定要保存  --prefix=/usr/local/nginx
/usr/local/nginx/sbin/nginx -V

3、处理新版nginx

#进入文件夹
cd /home/ubuntu/soft/
#下载新版nginx
wget http://nginx.org/download/nginx-1.23.3.tar.gz
#解压文件:
tar -zxvf nginx-1.23.3.tar.gz
#进入解压后的文件中:
cd nginx-1.23.3
#查询老版本的配配置***一定要保存
nginx -V
/usr/local/nginx/sbin/nginx -V
#配置nginx编译参数:
#1、不同版本的nginx的配置参数不同,可能不存在;2、也可能缺失对应的依赖包,需要自己手动下载(参考 yum -help)
./configure 获取的老版本的配置
#编译:
make
#覆盖原先的可执行文件-f 强制覆盖
cp -f objs/nginx /usr/local/nginx/sbin/nginx
#升级---升级中不停的访问这个ip的端口,测试,需要在新或者老版本的源码包中执行这个命令
make upgrade
##查询nginx的进程
ps -aux |grep nginx
##查看现在的版本信息
nginx -v

升级失败,版本回退

##老版本使用老的编译文件编译
./config 老的配置
##直接安装
make install
#校验版本
/usr/sbin/nginx -v
#全路径启动
service /usr/sbin/nginx restart

或者关停nginx
#/usr/sbin/nginx -s stop
#启动
#/usr/sbin/nginx

#如果发现Nginx无法启动,则可以使用以下命令查看Nginx的错误日志
tail -f /var/log/nginx/error.log

#测试Nginx是否正常工作。

测试代码-java

测试nginx进程是否在线

import cn.hutool.http.HttpUtil;

public static void main(String[] args) throws Exception {
    //这个地方是自己的页面或者接口地址都行
    String url = "https://test.ziji.com/ziji/user?recId=1234";
    long l1 = System.currentTimeMillis();
    for (int i = 0; i < 100; i++) {
        try {
            String s = HttpUtil.get(url);
            System.out.println("***success:"+s);
        } catch (Exception e) {
            System.out.println("***error:" + e.getMessage());
        }
    }
    long l2 = System.currentTimeMillis();
    System.out.println("*** l2-l1:" + (l2-l1));
}