Nginx平滑升级,不停服。虚拟机和docker环境下


前言

  1. 在不停老进程的情况下,启动新进程;

  2. 老进程负责处理仍然没有处理完的请求,但不再接受处理请求;

  3. 新进程接受新请求;

  4. 老进程处理完所有请求,关闭所有连接后,停止。

    这样就很方便地实现了平滑升级。

    一般有两种情况下需要升级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

1
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。