CDN失效如何加载本地静态文件? (姜戈)
How to load local static files if CDN fails? (django)
我正在使用 django 来开发我的网站,我正在尝试优化我的网站以提高速度,所以我想为我的 bootstrap 使用 CDN,如果它失败了,我想使用我服务器上的副本, 我看过
How to load local files if CDN is not working
但是它在 javascript 中做到了 但它并没有解决我的问题,我想知道
如何检查 CDN 是否与 Django 一起工作,如果不提供来自服务器的静态文件?
我不知道有什么好的方法可以做到这一点,但如果付钱给我的人真的想让我做的话,我会使用这种方法这项工作
您可以在单独的可插入应用程序中设置自定义 URL 标签,并让它 ping 您的 CDN 目标,如果失败,则提供本地 URI。诚然,对 CDN 目标执行 ping 操作并不意味着它会实际提供文件,因此更可靠的方法是尝试从 CDN 提供商获取文件,如果成功,则发送远程 URI,如果失败,发送本地 URI。这将使每个请求的静态文件流量加倍。
这还要求您设置静态文件服务,就像您计划从该服务器提供所有内容一样。我不推荐这些。我建议按照@ceejayoz 所说的去做,只使用可靠的 CDN。这就是他们生活的全部目的是防止做任何这样的事情。
不要尝试在服务器端执行此操作。 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。您不希望使用损坏的基础架构来赶走您的客户,或者使用最终会破坏生产的黑客技术。
这是可以实现的,但设置可能有点乏味。
基本上您正在尝试在 CDN 和您的源服务器之间进行故障转移。如果 CDN 失败,请求将故障转移到您的源服务器。一种选择是使用 DNS 级别故障转移,主要到 CDN CNAME,备份到您的原始服务器主机名。
并且您还在 CDN 和源服务器的 DNS 设置中包含健康检查。一旦 CDN 的健康检查失败,DNS 应该故障转移到您的源服务器并自动从那里提供静态文件。
我正在使用 django 来开发我的网站,我正在尝试优化我的网站以提高速度,所以我想为我的 bootstrap 使用 CDN,如果它失败了,我想使用我服务器上的副本, 我看过
How to load local files if CDN is not working
但是它在 javascript 中做到了 但它并没有解决我的问题,我想知道
如何检查 CDN 是否与 Django 一起工作,如果不提供来自服务器的静态文件?
我不知道有什么好的方法可以做到这一点,但如果付钱给我的人真的想让我做的话,我会使用这种方法这项工作
您可以在单独的可插入应用程序中设置自定义 URL 标签,并让它 ping 您的 CDN 目标,如果失败,则提供本地 URI。诚然,对 CDN 目标执行 ping 操作并不意味着它会实际提供文件,因此更可靠的方法是尝试从 CDN 提供商获取文件,如果成功,则发送远程 URI,如果失败,发送本地 URI。这将使每个请求的静态文件流量加倍。
这还要求您设置静态文件服务,就像您计划从该服务器提供所有内容一样。我不推荐这些。我建议按照@ceejayoz 所说的去做,只使用可靠的 CDN。这就是他们生活的全部目的是防止做任何这样的事情。
不要尝试在服务器端执行此操作。 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。您不希望使用损坏的基础架构来赶走您的客户,或者使用最终会破坏生产的黑客技术。
这是可以实现的,但设置可能有点乏味。
基本上您正在尝试在 CDN 和您的源服务器之间进行故障转移。如果 CDN 失败,请求将故障转移到您的源服务器。一种选择是使用 DNS 级别故障转移,主要到 CDN CNAME,备份到您的原始服务器主机名。
并且您还在 CDN 和源服务器的 DNS 设置中包含健康检查。一旦 CDN 的健康检查失败,DNS 应该故障转移到您的源服务器并自动从那里提供静态文件。