如果CDN失败,如何加载本地静态文件? (django的)

时间:2016-11-30 04:04:17

标签: python django cdn

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

3 个答案:

答案 0 :(得分:2)

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

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

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

正确的方法是

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

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

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

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

答案 1 :(得分:1)

我不知道会有一个很好的方法来做到这一点,但如果付钱给我的人真的希望我做这项工作,这就是我会用的方法

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

这也要求您设置静态文件服务,就像您计划从该服务器提供服务一样。我不会推荐任何这个。我建议做@cee​​jayoz所说的,只使用可靠的CDN。这就是他们生活中的全部目的是防止这样做。

答案 2 :(得分:0)

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

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

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