如何检测 nginx reload 何时完成流量传输?

如何检测 nginx reload 何时完成流量传输?

我通过以下方式管理自己的蓝/绿部署:

  1. 启动应用程序的新版本
  2. 更新 nginx 配置以指向新应用程序
  3. 向 nginx 发送重新加载信号
  4. 停止并清理旧应用程序

它运行得很好,但我仍然有几秒钟的停机时间,因为我在流量完全迁移到新应用程序之前就关闭了旧服务器。有没有办法知道 nginx 何时退出向旧应用程序发送流量的工作进程?

答案1

意识到:

  1. nginx 有一定数量的工作进程
  2. 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.

相关内容