在生产环境中对Nginx平滑升级的方法
因为需要用到nginx的新模块,需要重新编译安装nginx,但是整个过程网站需要继续提供服务器。如何解决这个问题?Nginx 支持在生产环境中进行版本升级或者增删模块,之间不会中止 Web 服务,用户不会感受到任何影响。
升级步骤:
1. 记下当前运行的 Nginx Master 进程的 PID
#ps aux | grep nginx
找到以root运行的nginx的master process的PID,不明白请参考,另一篇博文:Nginx控制信号详解
2. 备份旧版本
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
ps aux|grep nginx
3. 下载需要的源码包,进行模块配置,然后 make && make install 装到默认路径就可以了
4. 启动新版本的 Nginx, 发送 USR2 信号到旧版本的 PID,这样做会启动新版本,但是旧版本也不会退出, 两个版本会同时运行
kill -USR2 PID
5.如果没有什么问题的话可以停掉所有的旧版本的 worker 了,发送 WINCH 信号到旧版本 PID,此时用 ps aux|grep nginx 可以看到旧版本 Nginx 的 worker 会逐渐退出,最后所有请求都会由新版本的 Nginx 处理
kill -WINCH PID
6. 最后测试新版本没有问题后可以彻底停掉旧版本,发送 QUIT 信号到旧版本的 PID
kill -QUIT PID
如果测试后想恢复到旧版本的话,发送 HUP 信号到旧版 PID
kill -HUP PID
关闭新版本,发送 QUIT 到新版本 PID,如果着急,也可以用 TERM
kill -QUIT PID
最后把备份的 Nginx 替换回去
rm -rf /usr/local/nginx/sbin/nginx
mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx