当前位置: 首页 > news >正文

Nginx云计算大数据——安装AND版本升级(普通升级+平滑升级+失败回滚)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Nginx一键安装
    • 1.1基础环境,关闭防火墙与SELinux
    • 1.2 安装编译依赖
    • 1.3创建Nginx运行用户
    • 1.4编译安装Nginx
    • 1.5创建软链接
    • 1.6.检查、启动、重启、停止 nginx服务
    • 1.7添加 Nginx 系统服务
  • 二、升级
    • 2.1 确认当前 Nginx 信息
    • 2.2 下载目标版本 Nginx
    • 2.3 备份关键文件
  • 三、方案一:普通升级(停止服务升级)
    • 3.1 停止当前 Nginx 服务
    • 3.2 编译新版本 Nginx
    • 3.3 替换二进制文件并启动
  • 四、方案二:平滑升级(无感知不中断)
    • 4.1 核心原理:Nginx 信号机制
    • 4.2 操作步骤
      • 4.2.1 前期准备(同方案一)
      • 4.2.3 发送信号启动新版本主进程
      • 4.2.4 逐步关闭旧版本工作进程
      • 4.2.5 验证新版本并收尾
  • 五、升级失败回滚方案
    • 5.1 普通升级回滚
    • 5.2 平滑升级回滚
    • 总结:两种升级方案对比

前言

官方下载地址:nginx.org/en/download.html

一、Nginx一键安装

1.1基础环境,关闭防火墙与SELinux

为避免端口访问限制,脚本会临时关闭防火墙并禁用SELinux:

关闭防火墙与SELinux systemctl stop firewalld systemctl disable firewalld setenforce0/getenforcevim/etc/sysconfig/selinux

1.2 安装编译依赖

安装编译Nginx所需的开发工具和库:

yuminstall-y gcc gcc-c++makepcre pcre-devel zlib zlib-devel openssl openssl-devel

1.3创建Nginx运行用户

为Nginx创建一个无登录权限的系统用户,提升安全性:

useradd-M -s /sbin/nologin nginx

1.4编译安装Nginx

cd/opttarzxvf nginx-1.20.2.tar.gz
cdnginx-1.20.2/ ./configure\--prefix=/usr/local/nginx\#指定nginx的安装路径--user=nginx\#指定用户名--group=nginx\#指定组名--with-http_stub_status_module\--with-http_ssl_module#启用 http_stub_status_module 模块以支持状态统计
./configure\--prefix=/usr/local/nginx\--user=nginx\--group=nginx\--with-http_stub_status_module\--with-http_ssl_module
make&&makeinstall

1.5创建软链接

ln-s /usr/local/nginx/sbin/nginx /usr/local/sbin/#让系统识别nginx的操作命令

ps补充创建软链接的目的:

创建软链接(符号链接)的核心目的是灵活管理文件 / 目录的访问关系,具体用途包括:1. 简化文件 / 程序的访问路径 将深层目录中的文件 / 可执行程序链接到系统默认的 “快捷访问目录”(如/usr/bin、~),避免每次输入长路径。示例:bash运行# 将/usr/local/nginx/sbin/nginx链接到/usr/bin,直接执行nginx即可启动服务ln-s /usr/local/nginx/sbin/nginx /usr/bin/nginx2. 统一管理软件版本 当同一软件存在多个版本时,用软链接指向当前活跃版本,切换版本只需修改软链接的指向,无需修改依赖该软件的配置 / 脚本。示例:bash运行# 假设存在python3.8和python3.10,用软链接python3指向当前版本ln-s /usr/bin/python3.10 /usr/bin/python3# 切换版本时仅需重新创建链接ln-sf /usr/bin/python3.8 /usr/bin/python3

1.6.检查、启动、重启、停止 nginx服务

nginx -t #检查配置文件是否配置正确

1.7添加 Nginx 系统服务

方法一:vim/etc/init.d/nginx#!/bin/bash#chkconfig: 35 99 20 // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序#description:Nginx Service Control Script //这也是必须的COM="/usr/local/nginx/sbin/nginx"PID="/usr/local/nginx/logs/nginx.pid"case"$1"instart)$COM;;stop)kill-s QUIT$(cat$PID);;restart)$0stop$0start;;reload)kill-s HUP$(cat$PID);;*)echo"Usage:$0{start|stop|restart|reload}"exit1esacexit0chmod+x /etc/init.d/nginxchkconfig--add nginx#添加为系统服务servicenginx start|stop|restart|reload 系统服务 服务名称 启动模式 方法二:vim/lib/systemd/system/nginx.service[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginxExecReload=/bin/kill -s HUP$MAINPIDExecStop=/bin/kill -s QUIT$MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target ---------------------------------------------------------[Unit]:服务的说明 Description:描述服务 After:依赖,当依赖的服务启动之后再启动自定义的服务[Service]服务运行参数的设置Type=forking是后台运行的形式,使用此启动类型应同时指定 PIDFile以便systemd能够跟踪服务的主进程。 ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令PrivateTmp=True表示给服务分配独立的临时空间 注意:启动、重启、停止命令全部要求使用绝对路径[Install]服务安装的相关设置,可设置为多用户 ---------------------------------------------------------chmod754/lib/systemd/system/nginx.service

修改 Nginx 的 systemd 服务配置文件的权限

systemctl start nginx.service systemctlenablenginx.service

二、升级

2.1 确认当前 Nginx 信息

# 1. 查看当前 Nginx 版本nginx -v# 简洁版本信息,如 nginx version: nginx/1.20.0nginx -V# 完整信息(含编译参数),重点记录 --prefix、--with-xxx 等参数
# 2. 查看 Nginx 运行状态systemctl status nginx# 系统服务管理(CentOS/RHEL 7+、Ubuntu 16.04+)# 或通过进程查看ps-aux|grepnginx# 区分主进程(master)和工作进程(worker)
# 强制批量杀死pkill-9 nginx

2.2 下载目标版本 Nginx

# 进入源码存放目录(如 /opt)cd/opt# 下载源码包wgethttps://nginx.org/download/nginx-1.22.0.tar.gz# 解压tar-zxvf nginx-1.22.0.tar.gzcdnginx-1.22.0

2.3 备份关键文件

升级前必须备份 配置文件 和 旧版本二进制文件,防止升级失败后无法回滚:

# 1. 备份 Nginx 配置文件(默认路径为 --prefix 指定的 conf 目录)cp-r /usr/local/nginx/conf /usr/local/nginx/conf_bak_$(date+%Y%m%d)

/usr/local/nginx/conf_bak_( d a t e + (date +%Y%m%d) 目标路径:备份后的目录名,其中(date+(date +%Y%m%d)会自动生成 “年月日” 格式的后缀(如 20251218),避免备份文件重名

# 2. 备份 Nginx 日志文件(可选,避免日志丢失)cp-r /usr/local/nginx/logs /usr/local/nginx/logs_bak_$(date+%Y%m%d)
# 3. 备份旧版本二进制文件(后续会用到)mv/usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old

三、方案一:普通升级(停止服务升级)

先停止旧版本 Nginx,再替换二进制文件并启动新版本。操作简单,但会导致服务短暂中断(通常几秒到几十秒),适合非核心业务或可接受短时间停机的场景。具体操作步骤如下:

3.1 停止当前 Nginx 服务

# 方式1:通过系统服务停止(推荐,兼容 systemd)systemctl stop nginx# 方式2:通过 Nginx 自身命令停止nginx -s stop# 快速停止(可能中断正在处理的请求)# 或nginx -s quit# 优雅停止(等待所有请求处理完成后停止)

3.2 编译新版本 Nginx

编译参数必须与旧版本一致(参考第一步 nginx -V 输出的参数),否则可能导致配置不兼容或功能缺失:

# 进入解压后的新版本目录cd/opt/nginx-1.22.0# 执行 configure 配置(参数与旧版本保持一致)./configure\--prefix=/usr/local/nginx\# 安装路径(与旧版本相同)--user=nginx\# 运行用户--group=nginx\# 运行用户组--with-http_stub_status_module\# 状态监控模块--with-http_ssl_module# HTTPS 模块(若旧版本有则保留)#无注释版:./configure\--prefix=/usr/local/nginx\--user=nginx\--group=nginx\--with-http_stub_status_module\--with-http_ssl_module
# 编译(无需执行 make install,避免覆盖配置文件)make

3.3 替换二进制文件并启动

编译完成后,新版本二进制文件会生成在 objs/nginx 路径,将其复制到旧版本路径:

# 复制新版本二进制文件到运行目录cpobjs/nginx /usr/local/nginx/sbin/
# 启动新版本 Nginxsystemctl start nginx# 或nginx
# 查看版本(应显示目标版本 1.22.0)nginx -v# 查看服务状态(确保为 active (running))systemctl status nginx# 访问测试(若有 Web 服务,通过浏览器或 curl 验证)curlhttp://localhost

四、方案二:平滑升级(无感知不中断)

不停止旧版本主进程,通过信号控制逐步替换工作进程
整个过程中服务不中断,新请求由新版本处理,旧请求处理完成后旧进程退出,适合生产环境(尤其是核心业务)。

4.1 核心原理:Nginx 信号机制

Nginx 主进程(master)通过接收特定信号实现进程管理,平滑升级依赖以下 3 个关键信号:

USR2:主进程接收到后,会启动一个新版本的主进程,并继承旧版本的监听端口和配置;
WINCH:旧版本主进程接收到后,会逐步关闭所有旧版本工作进程(worker);
QUIT:优雅关闭主进程(等待所有工作进程结束后退出)。

4.2 操作步骤

4.2.1 前期准备(同方案一)

完成版本确认、源码下载、文件备份和新版本编译(步骤与方案一的 1~2 一致,确保 make 编译完成)。(到3.2)

4.2.2 复制新版本二进制文件
直接替换旧版本二进制文件(此时旧进程仍在运行,不影响服务)

# 备份旧版本二进制文件(若未备份可执行)mv/usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old# 复制新版本二进制文件(同方案一)cp/opt/nginx-1.22.0/objs/nginx /usr/local/nginx/sbin/nginx

4.2.3 发送信号启动新版本主进程

先找到旧版本 Nginx 主进程的 PID(通过 ps -aux | grep nginx 查看,通常是第一个 nginx 进程):

# 1. 查找旧版本主进程 PID(示例 PID 为 4787)ps-aux|grepnginx# 输出示例:root 4787 0.0 0.0 46008 1128 ? Ss 18:03 0:00 nginx: master process /usr/local/nginx/sbin/nginx
# 2. 发送 USR2 信号,启动新版本主进程kill-USR24787# 3. 再次查看进程,会发现两个主进程(旧 4787 + 新 PID,如 20345)ps-aux|grepnginx

4.2.4 逐步关闭旧版本工作进程

新版本主进程启动后,会自动创建新版本工作进程,此时需要关闭旧版本工作进程:

# 发送 WINCH 信号给旧版本主进程,关闭旧工作进程kill-WINCH11162# 查看进程:旧工作进程会逐步退出,仅剩旧主进程(4787)和新主进程+新工作进程ps-aux|grepnginx

4.2.5 验证新版本并收尾

确认新版本正常运行后,可彻底关闭旧版本主进程(若出现问题,可通过旧主进程回滚):

# 1. 验证新版本(此时 nginx -V 已指向新版本)nginx -V# 应显示 1.22.0,且编译参数正确# 2. 访问测试(通过浏览器或 curl 确认服务正常)curlhttp://localhost# 3. 彻底关闭旧版本主进程(升级无问题后执行)kill-s QUIT11162# 4. 再次查看进程:仅保留新版本主进程和工作进程ps-aux|grepnginx

五、升级失败回滚方案

无论哪种升级方式,都需提前准备回滚方案,确保出现问题时能快速恢复服务。

5.1 普通升级回滚

若启动新版本后服务异常,直接恢复旧版本二进制文件并重启:# 1. 停止新版本 Nginxsystemctl stop nginx# 2. 恢复旧版本二进制文件mv/usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx# 3. 启动旧版本 Nginxsystemctl start nginx# 4. 验证回滚结果nginx -v# 应显示旧版本

5.2 平滑升级回滚

# 1. 发送 HUP 信号给旧版本主进程,重启旧版本工作进程kill-s HUP 旧主进程PID(如11162# 2. 发送 QUIT 信号给新版本主进程,关闭新版本kill-s QUIT 新主进程PID(如11187# 3. 恢复旧版本二进制文件mv/usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx# 4. 验证回滚结果nginx -v# 应显示旧版本ps-aux|grepnginx# 仅保留旧版本进程

六、常见问题与注意事项
编译参数不一致导致启动失败
问题现象:nginx -t 报配置错误,或启动后服务异常。
解决:必须确保新版本 ./configure 参数与旧版本完全一致(参考 nginx -V 输出),缺失模块会导致配置不兼容。

权限问题导致无法启动
问题现象:启动时提示 permission denied。
解决:检查 nginx 二进制文件权限(建议 chmod 755 /usr/local/nginx/sbin/nginx),且运行用户(如 nginx)对日志目录、配置目录有读写权限。

平滑升级后旧主进程无法关闭
问题现象:执行 kill -QUIT 旧主进程PID 后,旧主进程仍存在。
解决:先检查是否有未结束的旧工作进程(ps -aux| grep nginx),等待其处理完请求后自动退出,或手动发送 TERM 信号强制关闭(kill -s TERM 旧工作进程PID)。

升级前务必测试配置
替换二进制文件后,启动前执行 nginx -t 检查配置文件是否兼容新版本,避免因配置语法变化导致启动失败:

总结:两种升级方案对比

对比维度 普通升级(停止服务) 平滑升级(无感知)
服务中断 是(短暂中断) 否(完全无感知)
操作复杂度 低(步骤少) 中(需管理信号)
适用场景 非核心业务、测试环境 生产环境、核心业务
回滚难度 低(直接恢复文件) 中(需控制进程)

无论选择哪种方案,升级前备份、升级中验证、升级后监控 都是必不可少的环节。通过本文的操作步骤,你可以根据业务场景灵活选择升级方式,确保 Nginx 版本升级安全、高效。

http://www.cnnetsun.cn/news/138203.html

相关文章:

  • GPT-5.2 实测数据流出:逻辑推理性能翻倍,大模型“幻觉”真的被终结了吗?
  • SQL SERVER——通过计划任务方式每月对配置数据、审计数据等进行备份
  • 前端——跨平台桌面应用开发实践
  • OpenAI 的反击!GPT-5.2 强行拉开代差,Gemini 3 和 Claude 4 还有机会吗?
  • 零售打工人加薪难?靠这张证,我在激烈竞争里站稳了脚跟
  • 基于springboot的多媒体素材库的开发与应用毕业论文+PPT(附源代码+演示视频)
  • 从离线语音到多模态智能体四博智联 AI 硬件整体解决方案全景解析
  • 我发现跨医院联合训练让诊断准确率飙升后来才知道是横向联邦学习在数据孤岛中的绝招
  • 性能压测工具:wrk
  • 论文引用标注工具排名2025:6大平台+自动规范推荐
  • Kotaemon AWS EC2部署实例:国际业务首选
  • 实在没货,简历(软件测试)咋写?
  • 网约车服务端线上流量巡检与测试验收技术
  • 公考日记7
  • 火电一次调频、自抗扰调频及群智能算法智能调频在MATLAB/Simulink中的应用
  • 科研实验室温湿度监控新范式:以太网 POE 技术全场景解决方案
  • RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
  • 探索SAR ADC:45nm工艺下的高速高精度设计
  • 【小增长技术团队东哥分享】Electron vs Electron-Vite vs Electron-Egg:桌面端开发到底该选谁?
  • 测试价值的量化评估:从成本中心到价值证明的路径探索
  • 测试领导力:在敏捷洪流中筑造质量堤坝
  • C++常用设计模式
  • Spring Boot 自动配置深度解析:原理、实战与源码追踪
  • 无代码解决方案:破解企业数字化转型效率困局
  • SAM (Segment Anything Model):万物皆可分割-k学长深度学习专栏
  • Mysql 报错 “Public Key Retrieval is not allowed”
  • 熊市中最适用的公式==底部建仓
  • 100G双光口网卡技术解析:Intel E810-CAM2方案的性能与应用突破
  • BioSIM抗人组蛋白H1抗体SIM0385:广泛应用于表观遗传学、染色质结构分析等领域
  • 智慧灯杆数字孪生系统:“多杆合一“技术实现