Azure的,最好的方式来存储和部署静态内容(例如图像/ CSS)?(Azure, best way

2019-07-21 00:17发布

我们对我们的.NET Web应用程序部署到Azure的Web角色。 我只是想知道其他人如何处理它们的静态内容,特别是图像和CSS? 目前,我们的应用程序包是约25MB,但是那18MB从图像纯粹衍生,像导航按钮,图标和模板组件很少能得到更新。 难道是明智的,这划分出来的部署包,并将其移动到Blob存储?

我对这种做法,我不知道是有效的几个疑惑...

  1. 我们的网站的80%,在HTTPS环境中运行。 将在团块存储访问图像会引入交叉脚本问题?

  2. 漏洞钱泄漏,如果有人试图恶意锤我们的图像(大部分是在20KB)?

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

任何想法或替代战略将受到欢迎。 我们的目标真的是缩小我们的部署包,以加快部署时间。 我也挺想卸载服务的专用节点的图像,以提高Web服务器的性能的想法,也许我的图像采集是如此之小,几乎不值得困扰?

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

这是我最后还是没买:

1.Transferred所有图片+ CSS来Blob存储容器。 我保持了图像和CSS文件夹内的任何子目录结构。

在我们的web.config文件2.产品使用的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.Excluded图像+ CSS文件夹和部署。

我的部署是现在小得多和图像外运行的CDN释放带宽,提高下载速度和释放一些负载从Web服务器。

更新日期:2015年9月

当回顾这段最近我碰到了来自微软的下列指南。 它进入更详细的关于如何使用查询字符串缓存胸围自动化资产的部署和。

在Web应用程序为来自Azure的CDN内容

Answer 1:

一些评论:

难道是明智的,这划分出来的部署包,并将其移动到Blob存储?

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

  1. 正如你所说,这会减少你的封装尺寸相当从而部署变得非常快。
  2. 同样,正如你所说,它会采取负载关闭您的Web服务器这样会让你的网站的响应速度。
  3. 如果您需要更新图像,JS,CSS文件,您可以只更换Blob存储这些文件。 如果他们在你的包被留下,你就需要重新部署你的包。
  4. 你也可以采取的Windows Azure CDN其中工程关Blob存储的优势。

我们的网站的80%,在HTTPS环境中运行。 将在团块存储访问图像会引入交叉脚本问题?

只要你不通过AJAX阅读的内容,我不认为你会碰到交叉脚本问题( 如何访问托管从蔚蓝蔚蓝的网站BLOB XML )。 但是,如果你的页面是通过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容器一个抽象的概念,但我可以用一个正斜杠在代码中模仿这个写文件。 显然,Windows不允许我这样做之前,我在Visual Studio中上传。

这里是一些提供给您的第三方工具Blob存储上传时,将保存到本地计算机的文件夹结构。 请看看这个博客帖子从Windows Azure存储团队: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx 。 显然,我个人最喜欢的是从Cerebrata云存储工作室:) [我是开发者的一个针对该产品]



Answer 2:

如果你的包越来越大的规模太大了,也许你可以从中受益部署,而不是一个大单包文件的独立文件。 至少在Visual Studio 2012,发布向导现在有这样的部署选项:

  • Web部署 (我鼓励这种你一)
  • Web部署包
  • FTP
  • 文件系统

据我所知,Web部署比较源文件和目标文件,物理transfering 只有不同的文件 (这可能比较文件的哈希值,但我不知道的内部)。

无论如何,我会尽量给一些更多的信息来解决你的问题:

我们的网站的80%,在HTTPS环境中运行。 将在团块存储访问图像会引入交叉脚本问题?

拉夫Mantri已经回答了这一点,而只是提供一点更近的信息,HTTPS现在支持访问Azure的CDN,所以你能避免混合内容的消息 。 (目前仍在等待自定义域支持/ SSL证书(带最新的信息UserVoice的要求在这里 )。

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

我挣扎,看看它是如何能够将文件上传到一个blob容器(从VS2010 + Azure的SDK)与目录的命名规则,所以我不需要重写路径引用的1000? 我很欣赏目录在BLOB容器一个抽象的概念,但我可以用一个正斜杠在代码中模仿这个写文件。 显然,Windows不允许我这样做之前,我在Visual Studio中上传。

同步静态文件成团块

您同步静态文件的其中一个脚本化的选择是AZCopy工具。

另一种方法是这样PowerShell脚本 (更多关于这方面的信息后 ),其中,汇总:

  1. 一开始的设定:

     $context = New-AzureStorageContext ` -StorageAccountName $StorageAccount ` -StorageAccountKey (Get-AzureStorageKey $StorageAccount).Primary 
  2. 枚举所有本地文件在\内容和\ 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 } 

引用CDN资产

要解决的另一个问题是如何引用的CDN的文件,而不是相对的文件。 不同的解决方案是有,大多采用辅助函数其中注入到适当的前缀的相对路径(有些回答以下问题可以帮助你: ASP.NET MVC相对路径 )。

我建议有建设CDN资产的URL的一种集中的方式,你甚至可以实现某种缓存杀手 (为此,你需要启用在Azure CDN查询字符串参数):

剃刀:

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

Helper方法:

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">


Answer 3:

If CDN or Blob Storage are not options, a simple way to make a folder serve files in Azure (or standard IIS) is to create a Web.config file inside the folder, like this:

<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> 


文章来源: Azure, best way to store and deploy static content (e.g. images/css)?