我有一个Flask应用程序运行在Amazon Web Services EC2 Ubuntu服务器上。当我更新代码时,我使用git将最新的代码推送到EC2实例。然而,当用户登录并且很可能正在进行某些操作时,他们将注销并被带到登录页面。
当我倾向于经常部署到我的应用程序时,这可能是一个问题。在ubuntu服务器上使用AWS或Flask是否有办法防止这个问题?我听说过亚马逊的CodeDeploy,但是,它看起来只适用于Elastic Beanstalk实例。
我能做什么?谢谢。
CodeDeploy与常规EC2实例一起工作,实际上不能与Elastic Beanstalk实例一起工作。请尝试阅读CodeDeploy用户指南,了解如何使用CodeDeploy的更多信息。
这仍然不会解决你的实际问题,这是你存储会话数据在你的web服务器的本地内存。如果你需要在一个负载均衡器后面使用多个主机,即使你设法保存和重新加载进程之间的状态,你也会遇到同样的问题。
这里有两个选项是有意义的:
- 基于cookie会话。您必须将验证登录会话所需的所有内容放在cookie中,以便您可以在不检查本地状态的情况下验证会话(请不要检查实际密码!)。这很容易在不安全的情况下做到,并且必须加密cookie(因此只有您的服务器可以读取它)。
- 共享会话存储。使用memcached、redis或其他更持久的东西(但速度更快——可能使用本地缓存)。将通常在本地存储的会话状态存储在共享缓存中。下面是一个使用Redis处理会话状态的Flask代码片段。
您当然可以使用CodeDeploy来帮助管理和部署这些不同的组件,但我认为您需要首先查看如何持久化会话。
您应该使用两个弹性beanstalk环境:development &生产。将所有即时更改推到开发环境中进行测试。当您准备好更新生产环境时(可能每天一次),请使用elastic beanstalk的交换环境url功能。这将引导所有用户到新更新的环境,同时最大限度地减少停机时间。