Azure,存储和部署静态内容的最佳方式(例如images / css)?

时间:2013-03-05 11:56:06

标签: image azure azure-storage-blobs static-content azure-cdn

我们即将将.NET Web应用程序部署到Azure Web角色。我只是想知道其他人如何处理他们的静态内容,特别是图像和CSS?目前我们的应用程序包大约是25mb,但其中18mb是纯粹来自图像,导航按钮,图标和模板组件等很少得到更新的东西。将其分配出部署包并将其移至blob存储是否明智?

我对这种方法有些怀疑,我想知道它是有效的......

  1. 我们网站的80%都在HTTPS环境中运行。访问blob商店中的图像是否会引入跨脚本问题?

  2. 如果有人试图恶意攻击我们的图片(大多数都不到20kb),那么漏金钱的可能性很小?

  3. 我很难看到如何使用目录命名约定将文件上传到blob容器(来自VS2010 + Azure SDK),所以我不需要重写1000个路径引用?我很欣赏目录是blob容器中的抽象概念,但是我可以使用正斜杠编写文件以在代码中模仿它。显然,在我上传Visual Studio之前,Windows不允许我这样做。

  4. 欢迎任何想法或替代策略。目标实际上是缩小我们的部署包以加快部署时间。此外,我非常喜欢将图像服务卸载到专用节点以提高Web服务器性能的想法,也许我的图像集很小,几乎不值得打扰?

    5月16日更新----------------------------------------- -------------------------------

    这是我最后所做的:

    1.将所有图像+ css传输到blob存储容器。我维护了images和css文件夹中任何子目录的结构。

    2.在我们的web.config文件中应用URL重写规则,如下所示..

      <rewrite>
        <rules>
          <rule name="imagestoazure">
          <match url="images/(.*)" />
          <action type="Redirect" url="https://xxxxx.vo.msecnd.net/images/{R:1}" />
        </rule>
      </rules>
      </rewrite>
    

    3.从应用程序中排除图像+ css文件夹并进行部署。

    我的部署现在要小得多,图像正在运行CDN,释放带宽,提高了下载速度,并释放了网络服务器的负载。

    更新:2015年9月

    最近审核时,我看到了Microsoft的以下指南。它详细介绍了如何使用查询字符串自动部署资产和缓存区域。

    Serve Content from Azure CDN in Your Web Application

3 个答案:

答案 0 :(得分:14)

一些意见:

  

将此分区出部署包并将其移至blob存储是否明智?

绝对。我可以看到这样做有很多好处:

  1. 正如您所提到的,这会大大减少您的包装尺寸,因此部署变得更快。
  2. 正如您所提到的,它会降低您的网络服务器的负载,从而使您的网站更具响应性。
  3. 如果您需要更新图像,js,css文件,您可以在blob存储中替换这些文件。如果它们留在您的包裹中,您需要重新部署包裹。
  4. 您还可以利用Windows Azure CDN,它可以用于blob存储。
  5.   

    我们网站的80%都在HTTPS环境中运行。将访问图像   一个blob商店引入了跨脚本问题?

    只要您没有通过AJAX阅读内容,我认为您不会遇到跨脚本问题(How to access XML hosted as azure blob from azure website)。但是,如果您的页面是通过https提供的,并且您通过http引用静态资源,则您的用户可能会收到混合内容(安全和不安全)消息。

      

    如果有人试图恶意攻击,就会漏掉钱   锤击我们的图像(大多数都在20kb以下)?

    请在此处查看出站带宽定价:http://www.windowsazure.com/en-us/pricing/details/#header-11。目前,Windows Azure正在运行促销,其中最多可以免费传输5 GB的数据,而且价格为0.12美元/ GB,相当便宜。您还需要考虑存储事务,这也非常便宜。我不会太担心它。在最糟糕的情况下,您始终可以恢复为共享访问签名并保护资源。

      

    我很难看到如何将文件上传到blob   容器(来自VS2010 + Azure SDK),具有目录命名约定   所以我不需要重写1000个路径引用?我很感激   目录是blob容器中的抽象概念,但我可以   用正斜杠写文件来模仿代码。明显   在我在Visual Studio中上传之前,Windows不允许我这样做。

    您可以使用许多第三方工具,这些工具将在blob存储中上传时保留本地计算机的文件夹结构。请查看来自Windows Azure存储团队的这篇博文:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx。显然,我个人最喜欢的是Cerebrata的云存储工作室:) [我是该产品的开发者之一]

答案 1 :(得分:4)

如果您的软件包的大小越来越大,也许您可​​以从部署独立文件而不是大型单个软件包文件中受益。至少在Visual Studio 2012中,发布向导现在具有以下部署选项:

  • 网络部署(我鼓励你这个)
  • Web部署包
  • FTP
  • 文件系统

AFAIK, Web Deploy 比较源文件和目标文件,物理传输仅限不同文件(它可能比较文件哈希,但我不知道内部)

无论如何,我会尝试提供更多信息来解决您的问题:

  

我们网站的80%都在HTTPS环境中运行。访问blob商店中的图像是否会引入跨脚本问题?

Gaurav Mantri已经回答了这个问题,但为了提供一些更新的信息,现在支持HTTPS访问Azure CDN,因此您可以避免混合内容消息。 (仍在等待支持自定义域/ SSL证书(具有最新信息here的UserVoice请求)。

顺便说一下,使用无协议约定(://{domain}/{relative path}),浏览器将使用与基本文档完全相同的HTTP或HTTPS协议。

  

我很难看到如何使用目录命名约定将文件上传到blob容器(来自VS2010 + Azure SDK),这样我就不需要重写1000个路径引用了?我很欣赏目录是blob容器中的抽象概念,但是我可以使用正斜杠编写文件以在代码中模仿它。显然,在我上传Visual Studio之前,Windows不允许我这样做。

将静态文件同步到blob

用于同步静态文件的一个可编写脚本的选项是AZCopy工具。

另一种选择是此powershell script(有关此post的更多信息),总结如下:

  1. 初始设置:

    $context = New-AzureStorageContext ` 
        -StorageAccountName $StorageAccount ` 
        -StorageAccountKey (Get-AzureStorageKey $StorageAccount).Primary
    
  2. 枚举。\ Content和。\ Scripts:

    上的所有本地文件
    $files = (ls -Path $ProjectPath\Content -File -Recurse) + (ls -Path $ProjectPath\Scripts -File -Recurse)
    
  3. ...并在循环中上传每个文件:

    foreach ($file in $files)  
        { 
            $blobFileName = (Resolve-Path $file.FullName -Relative).TrimStart('.') 
            $contentType = switch ([System.IO.Path]::GetExtension($file)) 
            { 
                ".png" {"image/png"} 
                ".css" {"text/css"} 
                ".js" {"text/javascript"} 
                default {"application/octet-stream"} 
            } 
    
            Set-AzureStorageBlobContent ` 
                -Container $StorageContainer ` 
                -Context $context ` 
                -File $file.FullName ` 
                -Blob $blobFileName ` 
                -Properties @{ContentType=$contentType} ` 
                -Force 
        } 
    
  4. 引用CDN资产

    要解决的另一个问题是如何引用CDN上的文件,而不是相关文件。有不同的解决方案,其中大多数都使用辅助函数为相对路径注入正确的前缀(以下问题的一些答案可以帮助您:ASP.NET MVC Relative Paths)。

    我建议采用集中式方式构建CDN资产网址,您甚至可以实现某种缓存杀手(为此,您需要在Azure CDN上启用查询字符串参数):

    剃刀:

    <img src="@Helper.ToCdnUrl("images/asset1.png")">
    

    帮助方法:

    public static string ToCdnUrl(string relativePath)
    {
        string prefix = ConfigurationManager.AppSettings["CdnUrlBasePath"];
        string sufix = ConfigurationManager.AppSettings["StaticFilesVersion"];
        return String.concat(prefix, relativePath, "?v=", sufix);
    }
    

    的AppSettings:

    <add key="CdnUrlBasePath" value="://<yourCDNName>.vo.msecnd.net/" />
    <add key="StaticFilesVersion" value="1.01" />
    

    呈现HTML:

    <img src="://<yourCDNName>.vo.msecnd.net/images/asset1.png?v=1.01">
    

答案 2 :(得分:3)

如果CDN或Blob存储不是选项,那么使文件夹在Azure(或标准IIS)中提供文件的简单方法是在文件夹中创建Web.config文件,如下所示:

<configuration>
    <system.webServer>
        <handlers>
           <clear />
            <add 
                name="StaticFile" 
                path="*" verb="*" 
                modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
                resourceType="Either" 
                requireAccess="Read" />
        </handlers>
        <staticContent>
            <mimeMap fileExtension=".*" mimeType="application/octet-stream" />
        </staticContent>
    </system.webServer>
</configuration>