在不停机的情况下在 AWS 上部署 Flask 应用程序

Deploying Flask application on AWS without downtime

我在 Amazon Web Services EC2 Ubuntu 服务器上有一个 Flask 应用程序 运行。当我更新代码时,我使用 git 将最新代码推送到我的 EC2 实例。但是,由于用户已登录并且很可能正在执行某些操作,因此他们会退出并转到登录页面。

因为我倾向于经常部署到我的应用程序,所以这可能是个问题。有没有办法在 ubuntu 服务器上使用 AWS 或 Flask 来防止这个问题?我听说过 Amazon 的 CodeDeploy,但是它似乎只适用于 Elastic Beanstalk 实例。

我能做什么?谢谢。

您应该使用两个弹性 beantalk 环境:开发和生产。将所有即时更改推送到开发环境以进行测试。当您准备好更新生产环境时(可能一天一次),请使用 Elastic Beanstalk 的交换环境 URL 功能。然后,这会将所有用户引导到新更新的环境,同时最大限度地减少停机时间。

CodeDeploy 适用于常规 EC2 实例,实际上不适用于 Elastic Beanstalk 实例。尝试阅读 CodeDeploy user guide 以了解有关如何使用 CodeDeploy 的更多信息。

这仍然不能解决您的实际问题,即您将会话数据存储在网络服务器的本地内存中。如果您需要在负载均衡器后面开始使用多个主机,即使您设法保存并重新加载进程之间的状态,您也会遇到同样的问题。

这里有两个有意义的选项:

  1. 基于 Cookie 的会话。您必须将验证登录会话所需的所有内容放入 cookie 中,这样您就可以在不检查本地状态的情况下验证会话(请使用实际密码以外的内容!)。这样做很容易不安全,并且必须加密 cookie(因此只有您的服务器才能读取它)。
  2. 共享会话存储。使用 memcached、redis 或更持久的东西(但速度快——可能使用本地缓存)。将您通常在本地存储的会话状态存储在共享缓存中。这是使用 Redis 进行会话状态的 Flask Snippet

你当然可以使用 CodeDeploy 来帮助管理和部署这些不同的组件,但我认为你需要先看看你是如何保持会话的。