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 # 监控错误日志