如何在后端升级期间暂停 Nginx 请求

Tob*_*bia 6 nginx

我希望 Nginx 在升级或重新启动后端服务、执行数据库迁移或其他一些管理任务时,在短时间内暂停(保留)http 请求,而不会对最终用户造成错误。

基本上我想做以下操作序列:

  1. 告诉 Nginx 停止将请求转发到我的后端,而是将它们保存在其异步队列中;
  2. 等待并在对后端的所有待处理请求完成时收到通知;
  3. 升级、重启或以其他方式对空闲的后端服务进行操作;
  4. 使用其私有地址快速验证后端服务是否正常运行;
  5. 打开 Nginx 的闸门,让所有待处理的请求通过。

理想情况下,这将使我能够执行需要对整个后端服务器进行独占访问的管理任务,例如重新启动、升级或迁移,而不会对最终用户造成比延迟更严重的事情,希望不到一分钟。

我找到了这个解决方案,但它没有解决第 2 点。此外,它需要将 Lua 解释器编译到 Nginx 中,可能会导致任何内存泄漏和安全问题。

是否有专门针对此问题的配置技巧或 Nginx 模块?可以用股票 Nginx 来完成,也许通过测试控制文件的存在?

其他管理员一般如何解决这个问题?

(我知道通用且有点庞大的uWSGI 应用程序服务器具有此功能以及其他数百种功能,但我宁愿避免在 Nginx 和我的后端之间引入另一个元素。)

小智 1

我猜您正在以最少的停机时间处理维护场景。

我建议您使用备份服务器将请求保留所需的秒数 <20>(或)甚至 <100> 秒,并在应用程序重新启动后重定向到原始 URI。

您可以关注下面的 nginx 线程,其中共享解决方案。

http://forum.nginx.org/read.php?2,177,177#msg-177