nginx的平滑升级及版本回滚

官方源码包下载地址:nginx: download

一、编译安装Nginx-1.24.0

root@Nginx \~\]# dnf install gcc pcre-devel zlib-devel openssl-devel -y \[root@Nginx \~\]# mkdir /nginx #创建目录,将nginx-1.24.0.tar.gz放在这个目录里 \[root@Nginx nginx\]# tar zxf nginx-1.24.0.tar.gz \[root@Nginx nginx-1.24.0\]# useradd -s /sbin/nologin -M nginx \[root@Nginx nginx\]# cd nginx-1.24.0/ \[root@Nginx nginx-1.24.0\]# ls ![](https://i-blog.csdnimg.cn/direct/bb3b5fe466d841e092b013adcb6c3705.png) \[root@Nginx nginx-1.24.0\]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

bash 复制代码
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面 
--with-http_gzip_static_module \ # 支持压缩 
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip

root@Nginx nginx-1.24.0\]# make \&\& make install

nginx完成安装以后,有四个主要的目录

root@Nginx nginx-1.24.0\]# ls /usr/local/nginx/ conf html logs sbin

conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他 的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀 去掉即可。

html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web 文件是默认的错误页面提示页面。

logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比 如/var/logs/nginx里面。

sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

二、验证版本及编译参数

root@Nginx \~\]# vim \~/.bash_profile export PATH=$PATH:/usr/local/nginx/sbin \[root@Nginx \~\]# source \~/.bash_profile \[root@Nginx \~\]# nginx -V nginx version: nginx/1.24.0

三、Nginx 启动文件

root@Nginx \~\]# vim /lib/systemd/system/nginx.service ![](https://i-blog.csdnimg.cn/direct/f8bfc0f5dd254cbabf57807f29dbe39f.png) \[root@Nginx \~\]# systemctl daemon-reload \[root@Nginx \~\]# systemctl start nginx ![](https://i-blog.csdnimg.cn/direct/99c4defe5a424b8b961df6474b04f11f.png)

四、平滑升级和回滚

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级。

4.1 平滑升级流程

  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • 向master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主 进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进 程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

4.2 将nginx-1.24.0平滑升级成nginx-1.26.2

1、将nginx-1.26.2.tar.gz和echo-nginx-module-0.63.tar放进/nginx目录里,并解压

root@Nginx nginx\]# tar zxf nginx-1.26.2.tar.gz \[root@Nginx nginx\]# tar zxf echo-nginx-module-0.63.tar

2、开始编译新版本

root@Nginx nginx\]# cd nginx-1.26.2/ \[root@Nginx nginx\]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/nginx/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module \[root@Nginx nginx-1.26.2\]# make #查看两个版本 \[root@Nginx nginx-1.26.1\]# ll objs/nginx /usr/local/nginx/sbin/nginx -rwxr-xr-x 1 root root 1239416 Jul 18 15:08 objs/nginx -rwxr-xr-x 1 root root 5671488 Jul 18 11:41 /usr/local/nginx/sbin/nginx

3、把之前的旧版的nginx命令备份

root@Nginx \~\]# cd /usr/local/nginx/sbin/ \[root@Nginx sbin\]# cp nginx nginx.24

4、把新版本的nginx命令复制过去

root@Nginx sbin\]# \\cp -f /root/nginx/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin

5、检查

root@Nginx sbin\]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

6、开始平滑升级

root@Nginx sbin\]# ps aux \| grep nginx ![](https://i-blog.csdnimg.cn/direct/5b8b6d66a1d84d549e3e6e6ed5f1a145.png)

USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的 nginx。

此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80。

此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进 程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。

root@Nginx sbin\]# kill -USR2 9511 \[root@Nginx sbin\]# ps aux \| grep nginx ![](https://i-blog.csdnimg.cn/direct/4ba9108b40304eb1a2b95e1640dd6915.png) \[root@Nginx sbin\]# curl -I(大写i) localhost ![](https://i-blog.csdnimg.cn/direct/b1d764f0d4a1474ab3a7a0b7b64e1fdb.png)

这时候依旧是旧版本生效,需要回收旧版本的worker进程

root@Nginx sbin\]# kill -WINCH 9511 \[root@Nginx sbin\]# ps aux \| grep nginx ![](https://i-blog.csdnimg.cn/direct/24c66c2d6a9040bfb9f6a38a9d03779c.png) \[root@Nginx sbin\]# curl -I(大写i) localhost ![](https://i-blog.csdnimg.cn/direct/59019b3dcf4342538628dbe330fc13f6.png)

到这里,平滑升级就完成啦!

4.3 回滚

如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker。

1、将备份好的nginx.26覆盖nginx

root@Nginx sbin\]# cp nginx nginx.26 \[root@Nginx sbin\]# ls nginx nginx.24 nginx.26 \[root@Nginx sbin\]# mv nginx.24 nginx mv: overwrite 'nginx'? y

2、重新换醒旧版本的worker进程:

root@Nginx sbin\]# kill -WINCH 9511

3、回收新版本的worker进程

root@Nginx sbin\]# kill -WINCH 12893 ![](https://i-blog.csdnimg.cn/direct/9a5bc862bec1435faf0fa8154399c089.png) 这时候就回滚到旧版本啦。

相关推荐
努力买辣条7 小时前
基于 Docker 的高可用 WordPress 集群部署:分布式 Nginx + Keepalived、MySQL 主从复制与 ProxySQL 读写分离
分布式·nginx·docker
程序员 _孜然9 小时前
Ubuntu/Debian修改网卡名字enP3p49s0为eth0
linux·运维·驱动开发·嵌入式硬件·ubuntu·debian
IDIOT___IDIOT9 小时前
Linux mount 命令
linux·运维·服务器
暗流者9 小时前
AAA 服务器与 RADIUS 协议笔记
运维·服务器·笔记
锐策9 小时前
Git checkout 与 Git reset 核心区别解析(分支与版本关联逻辑)
运维·git
算力魔方AIPC14 小时前
如何用算力魔方4060安装PaddleOCR MCP 服务器
运维·服务器
Ray Song15 小时前
【Linux】 wget、curl 用法区别
linux·运维·服务器·curl·wget
小妖66615 小时前
本地文件夹即时变身 Web 服务器(文件服务器)
运维·服务器
qq_3643717216 小时前
Docker 常见命令
运维·docker·容器
VVVVWeiYee19 小时前
TCP/UDP详解(一)
运维·网络·tcp/ip·udp·信息与通信