了解python web应用程序部署

2024-04-26 00:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我不完全了解部署过程。我知道的是:

  • 当我们需要进行热部署时——这意味着我们需要更改实时的代码——我们可以通过重新加载模块来完成,但是
  • imp.reload是个坏主意,我们应该重新启动应用程序,而不是重新加载已更改的模块
  • 理想情况下,正在运行的代码应该是代码存储库的克隆,在需要部署的任何时候,您只需提取更改即可

现在,假设我有多个wsgiapp实例在反向代理(如nginx)后面运行(在8011、8012等端口上)。并且,让我们假设我每秒收到5个请求。在

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

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

有人能彻底解释一下像这样繁忙的应用程序是如何被热部署的吗?在


Tags: 模块实例端口代码应用程序代理过程部署
2条回答

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

  1. 结构将您连接到服务器1
  2. 关闭web服务器
  3. 通过使用VCS或将tarball与新应用程序一起传输来部署更改
  4. 启动web服务器
  5. 转到1并连接到下一个服务器。在

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

编辑:

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

This directive causes requests to be distributed between upstreams based on the IP-address of the client. The key for the hash is the class-C network address of the client. This method guarantees that the client request will always be transferred to the same server. But if this server is considered inoperative, then the request of this client will be transferred to another server. This gives a high probability clients will always connect to the same server.

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

这会让你陷入

  1. 客户端连接到站点,从服务器1获得服务
  2. 服务器1在客户端完成任何操作之前更新
  3. 客户可能会陷入困境?在

这个场景回避了一个问题,你是否从你的API/站点中删除了一些可能会让客户机处于不确定状态的东西?如果您所做的只是更新UI元素或添加页面等,而不是更改任何后端api,那么您应该不会有任何问题。如果要删除API函数,则可能会出现问题。在

你不能让一半的服务器离线(比如把它们从负载平衡池中拉出来),然后更新它们吗。然后让他们回到网上,同时拉下另一半。然后更新这些并重新联机。在

这将确保您保持在线,同时也确保您的应用程序的旧版本和新版本不会同时在线。是的,这意味着你的网站将在这段时间内以其一半的容量运行。但那可能没问题吧?在

相关问题 更多 >