43人参与 • 2026-10-09 • Linux
生产环境升级 nginx,最怕什么?停服、报错、回不去。
这篇文章,手把手带你走一遍 零中断、可回滚 的平滑升级全流程,附真实踩坑复盘,照搬即可。
生产环境中的 nginx,常因漏洞修复、版本迭代、新增模块而需要升级。
传统方式——停服务 → 删旧版 → 装新版 → 启服务——会造成:
而 nginx 平滑升级 依托多进程热替换机制,可实现:
本文基于 centos 7 + nginx 编译安装,所有步骤均经真实实操验证,零基础运维可直接复制执行。
nginx 平滑升级依赖 4 个关键信号,新旧进程像接力赛一样交替:
| 信号 | 作用 | 时机 |
|---|---|---|
| usr2 | 启动全新版本的 master+worker 进程,新旧共存 | 升级开始 |
| winch | 优雅关闭旧版 worker,不再接新流量,存量连接跑完 | 流量切换 |
| quit | 优雅退出旧版 master,彻底完成升级 | 业务验证后 |
| hup | 平滑重载配置(日常修改配置用) | 不升级时 |
黄金法则:编译时的 --prefix 安装路径 必须 与当前运行的 nginx 原路径 完全一致,否则新进程读不到配置文件,直接启动失败——这是本文最大的踩坑点,下文会详细复盘。
无备份不升级!备份可实现 1 分钟极速回滚所有配置、日志、二进制。
tar -zcvf /usr/local/nginx-backup-$(date +%f).tar.gz /usr/local/nginx/
建议同时备份到其他目录或远程存储,双重保险。
新版本编译时,必须保留旧版所有参数,可新增模块,但绝不可删减,否则会导致模块缺失、升级失败。
/usr/local/nginx/sbin/nginx -v
本次实操原有参数(请替换为你自己的):
--prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module
yum install -y gcc make zlib-devel pcre-devel openssl-devel wget
本次升级示例版本:nginx-1.30.4(最新稳定版)
wget https://nginx.org/download/nginx-1.30.4.tar.gz #这个路径随便哪里都行 tar -zxvf nginx-1.30.4.tar.gz cd nginx-1.30.4
❌ 错误示范:首次编译时指定 --prefix=/data/nginx,与运行路径 /usr/local/nginx 不一致,导致新进程找不到配置文件,usr2 信号失效。
✅ 正确操作:--prefix 必须与旧版安装路径 完全一致。
./configure --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module
make
make install 会强制覆盖配置文件和目录结构,极大概率丢失业务配置。平滑升级只需要 make 生成新二进制即可,切勿执行 make install。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak.$(date +%f)
cp objs/nginx /usr/local/nginx/sbin/nginx
校验版本,确认替换成功:
/usr/local/nginx/sbin/nginx -v
此时应显示 nginx/1.30.4。
kill -usr2 $(cat /usr/local/nginx/logs/nginx.pid)
执行效果:
nginx.pid.oldbin,保存旧 master pid验证进程:
ps -ef | grep nginx
kill -winch $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
执行效果(新手必懂):
务必验证业务访问、接口、页面正常,无 404/502/ssl 异常后,再收尾!
# 校验配置语法 /usr/local/nginx/sbin/nginx -t # 查看端口监听 netstat -lntup | grep nginx # 查看错误日志 tail -20 /usr/local/nginx/logs/error.log
如果发现问题,立刻回滚(见第七部分),不要犹豫。
业务确认完全正常后,优雅退出旧 master:
kill -quit $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
# 仅剩新版 master+worker ps -ef | grep nginx # 确认最终版本 /usr/local/nginx/sbin/nginx -v
升级完成!
执行 kill -usr2 后无新进程生成,错误日志显示:
open() "/data/nginx/conf/nginx.conf" failed (2: no such file or directory)
nginx 编译时,--prefix 路径会硬编码进二进制程序。首次编译时指定了 /data/nginx,但实际运行路径是 /usr/local/nginx。
替换二进制后,新进程强制读取 /data/nginx/conf/nginx.conf,文件不存在,启动失败,自然无新进程。
重新执行 ./configure,确保 --prefix 与当前运行路径一致,重新 make 并替换二进制即可。
若升级后出现异常,10 秒极速回滚,无需停机。
# 还原旧版执行文件 cp /usr/local/nginx/sbin/nginx.bak.$(date +%f) /usr/local/nginx/sbin/nginx # 重新热升级回滚旧版本 kill -usr2 $(cat /usr/local/nginx/logs/nginx.pid)
# 解压之前的全量备份 tar -zxvf /usr/local/nginx-backup-$(date +%f).tar.gz -c / # 重载配置 /usr/local/nginx/sbin/nginx -s reload
建议优先用方式 1,速度最快;方式 2 适合配置也乱掉的情况。
| 命令 | 用途 |
|---|---|
nginx -s reload | 平滑重载配置(日常改配置) |
kill -usr2 pid | 启动新版本进程(升级第一步) |
kill -winch pid | 关闭旧 worker,切换流量 |
kill -quit pid | 优雅退出旧 master(升级收尾) |
nginx -s stop | 快速停止(不推荐生产) |
nginx -s quit | 优雅停止 |
📌 先备份,后操作——无备份绝不升级
📌 参数同源——新版 --prefix 和模块参数必须与旧版一致
📌 只 make 不 install——避免覆盖业务配置
📌 三步升级——usr2 双进程 → winch 切流量 → quit 清旧进程
📌 先验证再收尾——业务正常再结束旧进程,保留回滚机会
以上就是nginx平滑升级的保姆级教程的详细内容,更多关于nginx保姆级平滑升级的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论