假设我们有一个 Web 应用程序,由一个 nginx 实例后面的单个 进程(例如,如果用 Rust、Go、Java 等编写,这将是典型的)组成。是否可以设置 nginx 以便在我们需要升级应用程序时不会向客户端返回错误?如果我们有应用程序的单个进程,我相信唯一的方法是在没有应用程序运行时以某种方式使 nginx 将请求排队。当然,这意味着我们可能会延长某些请求的执行时间。而且,建议有一个合理的短暂停时间。以下是我们如何将 Web 应用程序从 1.15 版升级到 1.16 版的示例:
- 我们开始升级过程。此时我们有 3 个正在运行的请求。我们“告诉” nginx 不要向我们发送任何新请求,而是将它们排队。
- 在 3 个请求被完全处理或我们达到(比如说)10 秒的超时后,我们:
- 停止进程
1.15
; - 用;替换
1.15
可执行文件1.16
- 启动
1.16
。
- 停止进程
- Nginx 将排队的请求释放到新
1.16
实例。
这样的事情可能吗?如果是的话 - 怎么做?
PS 我知道零停机时间可以用 Kubernetes 之类的东西来实现,这也可以解决延迟响应的问题,但在这里我特别想问一个更简单的解决方案。