了解Python Web应用程序部署

tre*_*der 6 python deployment web-applications

我想我并不完全了解部署过程.这就是我所知道的:

  • 当我们需要进行热部署时 - 意味着我们需要更改现场代码 - 我们可以通过重新加载模块来实现,但是
  • imp.reload 是一个坏主意,我们应该重新启动应用程序,而不是重新加载已更改的模块
  • 理想情况下,运行代码应该是代码存储库的克隆,并且只要需要部署,就可以进行更改

现在,假设我有wsgi一个在反向代理后运行的应用程序的多个实例nginx(如8011,8012等端口).而且,我们还假设我5每秒都会收到请求.

现在在这种情况下,我应该如何在应用程序的所有正在运行的实例中更新我的代码.

  • 如果我停止所有实例,然后更新所有实例,然后重新启动它们 - 我肯定会丢失一些请求
  • 如果我逐个更新每个实例 - 那么实例将处于不一致状态(一些将运行旧代码,一些新代码),直到所有实例都更新.现在,如果请求命中更新的实例,然后后续(和相关)请求命中较旧的实例(尚未更新),那么我将得到错误的结果.

有人可以彻底解释这样繁忙的应用程序是如何热部署的吗?

Chr*_*tts 2

对于跨负载均衡器(如nginx)后面的多个热实例进行部署,我喜欢使用Fabric等工具进行滚动部署。

  1. Fabric 将您连接到服务器 1
  2. 关闭网络服务器
  3. 通过使用 VCS 或使用新应用程序传输 tarball 来部署更改
  4. 启动网络服务器
  5. GOTO1 并连接到下一个服务器。

这样你就永远不会离线,而且它是无缝的,因为 nginx 知道网络服务器何时被关闭,当它尝试循环到它时,就会转移到下一个,并且一旦节点/实例备份它将重新投入生产使用。

编辑:

您可以使用nginx 中的ip_hash模块来确保来自一个 IP 地址的所有请求在会话期间都发送到同一台服务器

该指令导致请求根据客户端的 IP 地址在上游之间分发。哈希的关键是客户端的 C 类网络地址。该方法保证客户端请求始终传输到同一个服务器。但如果该服务器被认为不工作,那么该客户端的请求将被转移到另一台服务器。这使得客户端很有可能始终连接到同一服务器。

这对您来说意味着,一旦您的 Web 服务器更新并且客户端连接到新实例,该会话的所有连接将继续转发到同一服务器。

这确实会让你陷入这样的境地

  1. 客户端连接到站点,从服务器 1 获取服务
  2. 服务器 1 在客户端完成他们正在做的事情之前更新
  3. 客户可能陷入困境?

这种情况引出了一个问题,您是否从 API/站点中删除了可能会让客户陷入困境的内容?如果您所做的只是更新 UI 元素或添加页面等,但不更改任何后端 API,那么您应该不会遇到任何问题。如果您要删除 API 函数,最终可能会遇到问题。