我们即将将.NET Web应用程序部署到Azure Web角色。我只是想知道其他人如何处理他们的静态内容,特别是图像和CSS?目前我们的应用程序包大约是25mb,但其中18mb是纯粹来自图像,导航按钮,图标和模板组件等很少得到更新的东西。将其分配出部署包并将其移至blob存储是否明智?
我对这种方法有些怀疑,我想知道它是有效的......
我们网站的80%都在HTTPS环境中运行。访问blob商店中的图像是否会引入跨脚本问题?
如果有人试图恶意攻击我们的图片(大多数都不到20kb),那么漏金钱的可能性很小?
我很难看到如何使用目录命名约定将文件上传到blob容器(来自VS2010 + Azure SDK),所以我不需要重写1000个路径引用?我很欣赏目录是blob容器中的抽象概念,但是我可以使用正斜杠编写文件以在代码中模仿它。显然,在我上传Visual Studio之前,Windows不允许我这样做。
欢迎任何想法或替代策略。目标实际上是缩小我们的部署包以加快部署时间。此外,我非常喜欢将图像服务卸载到专用节点以提高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的以下指南。它详细介绍了如何使用查询字符串自动部署资产和缓存区域。
答案 0 :(得分:14)
一些意见:
将此分区出部署包并将其移至blob存储是否明智?
绝对。我可以看到这样做有很多好处:
我们网站的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中,发布向导现在具有以下部署选项:
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不允许我这样做。
用于同步静态文件的一个可编写脚本的选项是AZCopy工具。
另一种选择是此powershell script(有关此post的更多信息),总结如下:
初始设置:
$context = New-AzureStorageContext `
-StorageAccountName $StorageAccount `
-StorageAccountKey (Get-AzureStorageKey $StorageAccount).Primary
枚举。\ Content和。\ Scripts:
上的所有本地文件$files = (ls -Path $ProjectPath\Content -File -Recurse) + (ls -Path $ProjectPath\Scripts -File -Recurse)
...并在循环中上传每个文件:
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上的文件,而不是相关文件。有不同的解决方案,其中大多数都使用辅助函数为相对路径注入正确的前缀(以下问题的一些答案可以帮助您: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>