在生产环境中进行Nginx升级时,保持服务不中断是关键。以下是Nginx平滑升级的标准方法:
准备工作
获取新版本
wget http://nginx.org/download/nginx-x.x.x.tar.gz
tar zxvf nginx-x.x.x.tar.gz
cd nginx-x.x.x
配置编译选项
./configure --prefix=/usr/local/nginx --with-编译选项
(使用nginx -V
查看当前编译参数)
编译新版本
make
执行平滑升级
# 备份旧二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# 复制新二进制文件
cp objs/nginx /usr/local/nginx/sbin/nginx
# 测试新版本配置
/usr/local/nginx/sbin/nginx -t
# 发送USR2信号给旧主进程
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# 发送WINCH信号给旧主进程,优雅关闭旧worker进程
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 确认新版本运行正常后,终止旧主进程
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
如果升级后发现问题,可以快速回滚:
# 重新启动旧版本主进程
kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 优雅关闭新版本worker进程
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
# 终止新版本主进程
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
如果使用yum/apt等包管理工具:
# CentOS/RHEL
yum update nginx -y
systemctl reload nginx
# Ubuntu/Debian
apt-get update
apt-get upgrade nginx -y
systemctl reload nginx
这种方法通常也能实现平滑升级,但控制粒度不如源码编译方式精细。