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) 这时候就回滚到旧版本啦。

相关推荐
2301_780943845 分钟前
linux 对文件打补丁(Patch)
linux·运维·服务器
ICT董老师11 分钟前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
敬往事一杯酒哈16 分钟前
Ubuntu 20.04 安装Anacada
linux·运维·ubuntu
还在忙碌的吴小二16 分钟前
Jenkins CLI (jcli) 使用手册
运维·jenkins
ChangYan.19 分钟前
Windows命令行(cmd)下快速查找文件路径(类似Linux下find命令)
linux·运维·服务器
陈让然35 分钟前
VS Code新版本无法连接WSL ubuntu18.04
linux·运维·ubuntu
lpfasd12338 分钟前
宝塔面板使用流程及注意事项
运维
小杰帅气40 分钟前
神秘的环境变量和进程地址空间
linux·运维·服务器
bleach-41 分钟前
buuctf系列解题思路祥讲--[SUCTF 2019]CheckIn1--文件上传以及user.ini的应用
nginx·web安全·网络安全·php