Skip to content

Nginx 平滑升级

随着网站并发访问量越来越高,nginx web 服务器也越来越流行,nginx 版本换代越来越频繁,新版本的nginx更新了许多新功能,生产环境中版本升级必然的,但是线上业务不能停,此时nginx的升级就是运维的重要工作了。

平滑升级核心原理

信号机制控制

Nginx通过接收特定信号实现新旧进程交替:

  • USR2:启动新主进程(保留旧进程)
  • WINCH:优雅关闭旧Worker进程
  • QUIT:终止旧主进程

无中断服务

新旧进程共存期间,新请求由新Worker处理,旧请求继续由旧Worker完成

平滑升级流程

准备工作

查看当前版本

bash
nginx -v  # 简要版本
nginx -V  # 详细编译参数(必须记录)

备份关键文件

bash
cp /usr/sbin/nginx /usr/sbin/nginx.old  # 二进制文件
cp -r /etc/nginx/ /etc/nginx.bak/       # 配置文件

安装编译依赖

bash
# CentOS
yum install -y gcc pcre-devel zlib-devel openssl-devel
# Ubuntu
apt-get install -y build-essential libpcre3-dev zlib1g-dev libssl-dev

编译新版本

bash
wget http://nginx.org/download/nginx-1.26.3.tar.gz
tar -zxvf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure <原编译参>  # 如--with-http_ssl_module
make  # 仅编译不安装

替换与信号控制

bash
# 替换二进制文件
cp objs/nginx /usr/sbin/nginx

# 启动新进程:向主进程(master)发送USR2信号,Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求
kill -USR2 $(cat /var/run/nginx.pid)

# 关闭旧Worker:向旧的Nginx主进程(master)发送WINCH信号,它会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
kill -WINCH $(cat /var/run/nginx.pid)

# 回滚步骤:如果这时需要回退继续使用旧版本,可向旧的Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)
kill -HUP $(cat /var/run/nginx.pid)

# 验证新版本运行正常后关闭旧主进程:向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出
kill -QUIT $(cat /var/run/nginx.pid.oldbin)

验证升级

nginx
nginx -v  # 确认版本
curl -I localhost  # 检查HTTP头
tail -f /var/log/nginx/error.log  # 监控错误日志