Windows Azure Content Delivery Network的最佳实践

摘自: https://msdn.microsoft.com/en-us/library/gg680299.aspx

我该如何使用web.config在托管类型的 CDN发送中来管理缓存的行为?

Windows Azure Content Delivery Network(CDN)利用由托管服务提供cache control头(译者注:参考https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 14.9 Cache Control)。如果内容是通过一个Web角色提供的,它将受到IIS的控制。静态内容的cache control头可以通过改变web配置中的<staticContent>元素中的<clientCache>元素进行定制。

例如:

下面的配置示例添加了一个"Expires: Tue, 19 Jan 2038 03:14:07 GMT"的HTTP头作为响应,配置要求从现在到期满之日为止。

<configuration>

   <system.webServer>

      <staticContent>

         <clientCache cacheControlMode="UseExpires"

            httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />

      </staticContent>

   </system.webServer>

</configuration>

在ASP.NET页面中,cache control被默认设置为私有。这样的话,Windows Azure CDN将无法存储这个内容。重写此方法,使用Response对象改变cache control默认设置。

例如:

            Response.Cache.SetCacheability(HttpCacheability.Public);

            Response.Cache.SetExpires(DateTime.Now.AddYears(1));

包含在你开始的根位置的设置将被继承到所有的子文件夹。请注意,你也可以在起始点的任何一个子目录下放置web.config文件,用来控制个人配置设置符合给定的子目录树。

你应该仅仅使用一个web.config文件添加非IIS默认的MIME类型。如果你使用一个web.config并重新定义一个标准的MIME类型的IIS可以返回500(请参见: https://blogs.msdn.com/b/chaun/archive/2009/12/04/iis7-error-cannot-add-duplicate-collection-entry-of-type-mimemap-with-unique-key-attribute-fileextension.aspx)。如果试图提供一个新的文件类型,作为一个最佳的方法,你通常只需要设置一个MIME类型并接收404。例如,通常在发布链接之前测试(如果需要的话)需要提供的新的文件类型并添加一个MIME类型。

用来管理我的Windows Azure项目中的不同的CDN环境的最佳办法有哪些?

例如,如果你想在相同的项目中拥有一个为测试环境vs.产品配置好的单独的CDN终端,我们建议在一个配置设置(ServiceConfiguration.cscfg)中放入不同的域,因为它们的值可以在运行中改变。但是web.config也是一个可接受的选择。

确保我的内容新鲜的最佳方法是什么?

设置好的到期cache头是确保新鲜度,控制成本,并向客户提供最佳性能的最简便的方法。

请参见https://msdn.microsoft.com/en-us/library/gg680305.aspx

我可以在Windows Azure CDN中使用不同的文件夹名吗?

当然可以。Windows Azure CDN仅仅反映URL结构到你的源内容,你可以根据你的需要,尽可能深的嵌套它。

在SDK 1.4版本中,对于托管服务对象的传递,你被局限于在你服务上的/cdn根目录下发布。

在缓存中如何使用查询字符串变量?

对于托管服务对象的传递,当你启用CDN的托管服务时,你可以在Windows Azure Developer Portal中切换这个行为。“启用”是指整个查询字符串将被用来作为对象的cache key的一部分;也就是说,具有相同的URL根路径但拥有不同查询字符串的对象将被贮存为单独的对象。“禁用”是指不同的查询字符串值被忽略,只有URL根路径作为cache key使用,所以不同的查询字符串被视作相同的对象,并且只贮存一次。

在BLOB存储起点,查询字符串总是被忽略。

有什么例子可以说明我如何使用HTTPS传递?

Windows Azure CDN上的HTTPS传递用来传递必须包含在一个安全的会话框内的公开有效的对象。例如,一个shopping cart可能会使用很多“chrome”对象包含graphics, buttons, static scripts和其他可重用的元素;在一个安全的shopping-cart页面流中,这些对象必须通过HTTPS来发送,以避免浏览器的警告。

Windows Azure CDN如何进行同步?

不会进行同步。在Windows Azure CDN中文件加载为“pull”。根据来自客户端的请求,文件被上传到一个单一的位置(例如 origin)并且进入到缓存节点中。

我的服务被部署在Windows Azure CDN的哪个节点?

当你部署到Windows Azure CDN,你会自动的被部署到我们所有的位置,并且你会添加到其他每个在线上的位置。你不需要做任何事情去开始利用一个新CDN节点。Windows Azure CDN利用Anycast将最终用户引导到最近的节点。

在Windows Azure CDN中符合字节范围要求的最佳做法是什么?

不要在一个大文件的结尾放置你的signatures/table-of-contents/catalog,然后使用一字节的GET去检索它。这会导致欠佳的性能。一个签名文件应该被放在一个文件的开始,或者更为理想的是作为一个单独的文件。

Windows Azure CDN如何使用压缩内容来工作?

Windows Azure CDN不会修改(增加)压缩内容到你的对象。Windows Azure CDN涉及到的任何压缩都是由基于“Accept-Encoding”头的起点提供。从1.4版本起,Azure Storage不再支持压缩。如果你想使用托管服务对象传递,你可以配置IIS来返回压缩对象。

我如何在Windows Azure CDN中清理或禁用内容?

从1.4版本起,没有清理功能。这个功能正在开发中。最新的操作是按照本文档和MSDN上的Windows Azure CDN文档中描述的设置好到期的cache头。

示例问题报告:"The CDN isn't getting fresh objects," 或者, "The CDN seems to be caching objects for 72 hours"

你没有发送Cache-Control头,或这传入了一个无效的值到我们的CDN,因此忽略了它,并且将贮存72个小时。

Cache-control头必须是“public”并且拥有一个大于300的值,否则CDN将会忽略它。如果你故意发送一个小于300的Cache-Control值,那么它的内容按理说不应该从一开始就放置到CDN。

请按照后面的链接所描述的,将你的过期时间调整为最佳值:https://msdn.microsoft.com/en-us/library/ff919705.aspx

CDN多久从起始处刷新一次对象?

这取决于对象cache-control头(或许缺少头),对象的通用性,双亲缓存能力和边缘应用。它将至少每节点每更新窗口访问内容源一次,并且跟踪If-Modified-Since刷新请求。

如果没有设置Cache-Control头,请参考上面“72 hours”的问题。

 

 

本文翻译自:https://blogs.msdn.com/b/windowsazure/archive/2011/03/18/best-practices-for-the-windows-azure-content-delivery-network.aspx