.net - 静态 Assets 、CDN 和多服务器环境的 404 问题

标签 .net css deployment squishit

我们的生产环境有问题,也许其他人遇到过这个问题并且有一个聪明的解决方案。

先决条件:

  • 我们在两台前端服务器前使用负载均衡器。
  • 我们使用 CDN 来传送静态 Assets ,例如 CSS/JS/图像。
  • 我们使用 SquishIt 使用校验和对我们的 JS/CSS 文件进行指纹识别以提供缓存清除
  • 我们在应用程序启动时在 Assets 路径前加上 CDN 路径。这也是 SquishIt 的一项功能 (.WithOutputBaseHref)。示例:/ui/main_465987ecb75.css 将呈现为 //cdn.host.com/ui/main_465987ecb75.css

部署例程:

  1. 将 server1 从负载均衡器中移除。
  2. 部署到 server1。
  3. 加热。
  4. 在负载平衡器中包含服务器 1。
  5. 将 server2 从负载均衡器中移除(...并重复步骤 2-4)

这里是它失败的地方:

在上面的第 4 步和第 5 步之间,我们让两台服务器短时间在线。在此期间,server1 可能会引用 main_46eb48ac968.css,而 server2 可能会引用 main_987eba4687.css。这将在以下场景中引起麻烦......

用例:

  1. 用户访问站点并最终到达新部署的服务器 1。
  2. 浏览器将从 CDN 请求 main_46eb48ac968.css。
  3. CDN 从负载均衡器请求该文件,因为它不在其缓存中。
  4. 负载均衡器将 CDN 请求发送到服务器 2。
  5. Server2 返回 404 页面未找到错误,因为新文件仅在服务器 1 上。
  6. 网站看起来很垃圾!

一个简单的解决方案当然是在部署期间在没有 CDN 的情况下运行,但是由于 CDN url 在应用程序启动期间被添加到路径中,我们将不得不在生产环境中重新启动应用程序...:/

想法?

最佳答案

嗯,所以我认为您的 CDN 正在使用您的网站作为来源?

您可能想要查看 this issue .这样做是将散列写入生成的路径中的文件夹,然后您可以使用 IIS 重写规则在进入的过程中从 URL 中删除该文件夹。这样做是为了提供一个选项,该选项提供“文件名中的散列”选项的可靠缓存清除,不会导致文件爆炸。您可以使用它来确保提供某物 - 但在这种情况下,它会在您的 CDN 缓存中留下旧版本的文件(因此您需要在完成部署后使所有内容无效).

这将在下一个版本 (0.9.3) 中可用

关于.net - 静态 Assets 、CDN 和多服务器环境的 404 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020187/

相关文章:

mysql - 如何检测两个数据库之间的表和存储过程的变化?

javascript 过滤器功能在 IE 11 中不起作用,但在 Chrome 和 Mozilla 中运行良好

c# - 引用 visual studio 2010 中缺少 System.ServiceModel.dll

.NET 不使用 DLL

javascript - getElementByID() 函数返回空值

css - 从代码中删除行

azure - 将 netcoreapp1.1 部署到 Azure

java - 在 Tomcat 5.5 中部署 web-app 时如何解决错误 listenerStart?

c# - 在 FluentMigrator 上创建表之前检查表是否存在

html - 从 materializecss 中删除输入样式