【问题标题】:How to load local static files if CDN fails? (django)CDN失败如何加载本地静态文件? (django)
【发布时间】:2017-04-14 06:54:01
【问题描述】:

我正在使用 django 开发我的网站,我正在尝试优化我的网站以提高速度,所以我想使用 CDN 作为我的引导程序,如果它失败了,我想使用来自我的服务器的副本,我已经看到了
How to load local files if CDN is not working
但它是在 javascript 中完成的,但它不能解决我的问题,我想知道
如何检查 CDN 是否与 Django 一起工作,如果不从服务器提供静态文件?

【问题讨论】:

  • 使用可靠的 CDN 即可。

标签: python django cdn


【解决方案1】:

不要尝试在服务器端执行此操作。 CDN 服务的构建是可靠的,因为它们在地理上分布且具有容错性,并使用可用的最佳实践。

您无法通过 从您的 Django 应用程序 ping CDN 服务器来确定 CDN 服务器是否为您的用户工作。您的用户位于不同的位置,并且可能具有非常不同的网络条件,例如正在使用来自不同国家/地区的移动网络连接,并且有一个遇到中断的网络提供商。

确实,您可以 ping CDN 服务器,这可能会解析为您的 Django 应用程序获取一个 CDN 负载平衡器地址并尝试查看该地址是否适合您,如果 CDN 源为下。然后,您可能必须查看您拥有的每个资源,即每个 JavaScript 和 CSS 文件,如果它们可用,则加载本地备份(如果不可用)。在服务器端。 这是非常缓慢且容易出错的。网络可能由于 googolplex 不同的原因而失败。

解决这个问题的正确方法是

  • 仅使用本地服务器为这些静态文件提供服务,将负载分配给应用服务器,每个应用服务器都有自己的静态文件版本副本。如果您的应用程序服务器正常工作,它也应该有可用的副本;
  • 在客户端进行检查,因为如果服务器不靠近您的 CDN 网络,服务器端查询会使您的服务器停止运行,并且您通常不希望依赖服务器端的任何外部资源;
  • 或者,我建议您设置自己的 CDN,从代理 URL 或子域为您的本地文件提供服务。阅读下文。

理想情况下,如果您希望使用可靠的 CDN 源,您应该在用于托管文件的同一基础架构上设置具有冗余的 CDN 服务器。

因为您的站点位于 www.example.com,这是您的 Django 应用程序服务器地址。您将设置作为 CDN 服务的 cdn.example.com 域,例如 CloudFront 或类似服务,代理您对 www.example.com/static/ 的请求并将您的静态文件镜像为 CDN,从而减轻您的负担应用服务器。您可以定义您的 Django 应用程序以使用http://cdn.example.com/static 地址来提供静态文件。 有多种不同的服务可以为您的应用程序提供 CDN,CloudFront 只是一种选择。这将使您的静态、可 CDN 文件靠近您的用户。

理想情况下,您的应用程序服务器和 CDN 服务器托管在同一个冗余基础架构上,您可以声称,如果您的基础架构的一部分正常工作,其他部分也会正常工作,或者您的服务提供商违反了您的 SLA。您不希望使用损坏的基础架构并赶走您的客户,或使用最终会破坏生产的黑客。

【讨论】:

    【解决方案2】:

    我不知道有什么好的方法可以做到这一点,但如果付钱给我的人真的想让我完成这项工作,我会使用这种方法

    您可以在单独的可插入应用程序中设置自定义 URL 标签,并让它 ping 您的 CDN 目标,然后如果失败,则提供本地 URI。诚然,ping CDN 目标并不意味着它实际上会提供文件,因此更可靠的方法是尝试从 CDN 提供商获取文件,如果成功,则发送远程 URI,如果失败,发送本地 URI。这将使每个请求的静态文件流量翻倍。

    这还需要您设置静态文件服务,就像您计划从该服务器提供所有内容一样。我不会推荐这些。我建议按照@ceejayoz 所说的去做,并且只使用可靠的 CDN。这就是他们生活中的全部目的是防止这样做。

    【讨论】:

      【解决方案3】:

      这是可以实现的,但设置可能有点乏味。

      基本上,您正在尝试在 CDN 和源服务器之间进行故障转移。如果 CDN 失败,请求将故障转移到您的源服务器。一种选择是使用 DNS 级别的故障转移,主要是 CDN CNAME,备份到您的原始服务器主机名。

      您还在 CDN 和源服务器的 DNS 设置中包含健康检查。一旦 CDN 的健康检查失败,DNS 应该故障转移到您的源服务器并自动从那里提供静态文件。

      【讨论】:

        最近更新 更多