Nginx不关机升级(平滑升级)的实战指南
作者:m0_46460826
一、升级前的准备工作
1.1 备份关键数据
升级前必须备份Nginx的安装目录(如/usr/local/nginx
或/data/nginx
)、配置文件(如/usr/local/nginx/conf/nginx.conf
)及日志文件(如/usr/local/nginx/logs/error.log
)。例如:tar -zcvf /data/nginx-backup-$(date +%F).tar.gz /usr/local/nginx/
备份是回滚的核心保障,避免升级失败导致数据丢失。
1.2 确认旧版本信息
执行以下命令获取旧版本的编译参数(关键!新版本需保持一致)和版本号:
nginx -V
1.3 安装编译依赖
确保系统安装了新版本所需的依赖库(如gcc、pcre-devel、openssl-devel):dnf install -y gcc make zlib-devel pcre-devel openssl-devel wget # RockyLinux/RHEL
yum install -y gcc make zlib-devel pcre-devel openssl-devel wget # CentOS
依赖缺失会导致编译失败。
二、下载并编译新版本Nginx
2.1. 下载新版本源码
访问Nginx官网(nginx.org/download)下载所需版本(如1.22.0),并解压:
wget https://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz cd nginx-1.22.0
2.2 编译新版本
使用旧版本的编译参数执行configure(避免功能冲突),然后编译(不要执行make install,防止覆盖旧版本):
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module # 复用旧参数 make
编译完成后,新版本的二进制文件会生成在objs/nginx目录下。
三、执行平滑升级流程
3.1. 替换旧版本二进制文件
将新编译的objs/nginx复制到旧版本的安装目录(如/usr/local/nginx/sbin/),替换旧的可执行文件:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # 备份旧文件 cp objs/nginx /usr/local/nginx/sbin/nginx # 替换为新文件
若提示Text file busy错误,说明旧文件正在被进程占用,需先通过后续步骤停止旧进程后再替换。
3.2. 启动新主进程
向旧版本的主进程发送USR2信号,启动新版本的主进程(加载新二进制文件),此时新旧版本的主进程会同时运行:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) # 替换为旧版本的PID
执行后,可通过ps -ef | grep nginx查看,此时有两个主进程(旧版本和新版本)。
3.3. 优雅关闭旧工作进程
向旧版本的主进程发送WINCH信号,逐步关闭旧版本的工作进程(Worker Process),新版本的工作进程会接管请求(确保连接不中断):
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 替换为旧主进程的PID
通过ps -ef | grep nginx
确认旧工作进程已退出,旧主进程仍在运行(用于回滚)。
3.4. 验证新版本状态
- 检查新版本是否运行:nginx -v(应显示新版本号,如1.29.0);
- 查看日志无报错:tail -f /usr/local/nginx/logs/error.log;
- 确认端口在线:netstat -lntup | grep 80(或监听端口)。
3.5. 结束旧主进程
业务验证无误后,向旧版本的主进程发送QUIT信号,彻底关闭旧版本:
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 替换为旧主进程的PID
再次执行ps -ef | grep nginx
,确认旧进程已全部退出,升级完成。
四、升级失败的回滚操作
若升级后出现异常(如服务中断、功能失效),可快速回滚到旧版本:
4.1. 恢复旧二进制文件
将备份的旧版本二进制文件复制回安装目录:cp /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx
4.2. 重新加载旧版本
向新版本的主进程发送HUP信号(或直接重启Nginx),拉起旧版本的工作进程:
kill -HUP $(cat /usr/local/nginx/logs/nginx.pid) # 替换为新主进程的PID(即旧主进程的PID) 或直接重启: /usr/local/nginx/sbin/nginx
4.3. 清理旧进程
若旧主进程未自动退出,可发送QUIT信号关闭:kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
回滚完成后,再次验证服务状态。
tar -zcvf /opt/nginx-$(date +%F).tar.gz /usr/local/nginx/ #备份文件目录+时间 //需要备份的文件目录 wget https://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz #解压缩 ./configure \ > --prefix=/usr/local/nginx \ > --user=nginx \ > --group=nginx \ > --with-http_stub_status_module \ > --with-http_ssl_module #备份 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak #编译 make #新文件替换到旧文件路径 cp objs/nginx /usr/local/nginx/sbin/nginx # kill -USR2 $(cat /usr/local/nginxlog/nginx.pid) kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
关键注意事项
- 编译参数一致性:新版本必须使用与旧版本完全相同的configure参数(可新增参数,但不能删除原有模块参数),否则会导致功能异常;
- 避免覆盖运行文件:不要直接使用cp覆盖正在运行的二进制文件,需通过平滑升级流程处理;
- 监控系统资源:新旧版本同时运行时会占用双倍内存,确保服务器资源充足;
- 测试环境验证:生产环境升级前,务必在测试环境完成全流程验证,避免突发问题。
./configure \ --prefix=/usr/local/nginx \ # 安装目录 --user=nginx \ # 运行用户(后续会创建) --group=nginx \ # 运行用户组 --with-http_ssl_module \ # 启用 HTTPS 模块 --with-http_v2_module \ # 启用 HTTP/2 协议(提升性能) --with-http_gzip_static_module \ # 启用静态 gzip 压缩 --with-http_stub_status_module \ # 启用状态监控模块 --with-pcre \ # 启用 PCRE 正则支持(rewrite 依赖) --with-stream \ # 启用 TCP 代理模块(如反向代理数据库) --with-stream_ssl_module \ # 启用 TCP 代理的 SSL 支持 --http-log-path=/var/log/nginx/access.log \ # 访问日志路径 --error-log-path=/var/log/nginx/error.log \ # 错误日志路径 --pid-path=/var/run/nginx/nginx.pid \ # PID 文件路径 --lock-path=/var/lock/nginx.lock # 锁文件路径 注意: 可根据需求增减模块(如 --without-xxx 禁用不需要的模块) 企业若需特殊模块(如第三方缓存模块),可通过 --add-module 引入
到此这篇关于Nginx不关机升级(平滑升级)的实战指南的文章就介绍到这了,更多相关Nginx不关机升级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!