我通过以下方式管理自己的蓝/绿部署:
- 启动应用程序的新版本
- 更新 nginx 配置以指向新应用程序
- 向 nginx 发送重新加载信号
- 停止并清理旧应用程序
它运行得很好,但我仍然有几秒钟的停机时间,因为我在流量完全迁移到新应用程序之前就关闭了旧服务器。有没有办法知道 nginx 何时退出向旧应用程序发送流量的工作进程?
答案1
意识到:
- nginx 有一定数量的工作进程
- reload 的工作原理是,为新配置启动相同数量的新进程,然后在流量不再流向旧进程时停用旧进程
我决定只计算工作进程的数量,然后等到它恢复正常。就像这样:
function nginx-workers {
echo $(ps -ef | grep "nginx: worker process" | grep -v grep | wc -l)
}
# Get the original number of worker processes.
# I made it generic so that it works on machines of any size.
numWorkerProcesses=$(nginx-workers)
# Issue the reload signal.
sudo nginx -s reload
# Wait for the number of workers to return to normal.
while [ $(nginx-workers) -ne $numWorkerProcesses ]
do
sleep 1;
done;
# Reload is complete and I can safely retire the old service.