28

.NETWebアプリケーションをAzureWebロールにデプロイしようとしています。他の人が静的コンテンツ、特に画像とCSSをどのように処理したのか疑問に思っていますか?現在、アプリケーションパッケージは約25 MBですが、そのうち18 MBは、ナビゲーションボタン、アイコン、テンプレートコンポーネントなど、ほとんど更新されない画像から純粋に派生しています。これをデプロイメントパッケージから分割してBLOBストレージに移動するのが賢明でしょうか?

私はこのアプローチについていくつか疑問がありますが、私はそれが有効であると思っています...

  1. 当サイトの80%はHTTPS環境で運営されています。BLOBストアの画像にアクセスすると、クロススクリプトの問題が発生しますか?

  2. 誰かが私たちの画像を悪意を持って槌で打とうとした場合(ほとんどが20kb未満)、お金の漏洩に対する脆弱性はありますか?

  3. ディレクトリの命名規則を使用して(VS2010 + Azure SDKから)blobコンテナーにファイルをアップロードする方法を確認するのに苦労しているので、何千ものパス参照を書き直す必要はありませんか?ディレクトリはblobコンテナーの抽象的な概念であると思いますが、コードでこれを模倣するためにスラッシュを使用してファイルを書き込むことができます。明らかに、Windowsでは、VisualStudioにアップロードする前にこれを行うことはできません。

任意の考えや代替戦略を歓迎します。目標は、実際には、展開パッケージを縮小して展開時間を短縮することです。また、専用ノードに提供する画像をオフロードしてWebサーバーのパフォーマンスを向上させるというアイデアも非常に気に入っています。おそらく、画像コレクションが非常に小さいため、気にする価値はほとんどありません。

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

これが私が最後にしたことです:

1.すべての画像とcssをBLOBストレージコンテナに転送しました。画像と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で実行されて帯域幅を解放し、ダウンロード速度を向上させ、Webサーバーからの負荷を解放しています。

更新:2015年9月

最近これをレビューしたとき、私はマイクロソフトからの次のガイドに出くわしました。クエリ文字列を使用してアセットのデプロイとキャッシュバストを自動化する方法について詳しく説明します。

WebアプリケーションでAzureCDNからコンテンツを提供する

4

3 に答える 3

14

いくつかのコメント:

これを展開パッケージからパーティション分割して、BLOB ストレージに移動するのが賢明でしょうか?

絶対。これを行うことには多くの利点があります。

  1. おっしゃったように、これによりパッケージのサイズが大幅に縮小されるため、展開がはるかに高速になります。
  2. 繰り返しになりますが、Web サーバーの負荷が軽減されるため、サイトの応答性が向上します。
  3. 画像、js、css ファイルを更新する必要がある場合は、ブロブ ストレージ内のそれらのファイルを置き換えるだけです。それらがパッケージに残っている場合は、パッケージを再デプロイする必要があります。
  4. また、ブロブ ストレージで動作する Windows Azure CDN を利用することもできます。

サイトの 80% は HTTPS 環境で実行されています。ブロブ ストア内の画像にアクセスすると、クロス スクリプトの問題が発生しますか?

AJAX を介してコンテンツを読んでいない限り、クロス スクリプトの問題 ( Azure Web サイトから Azure BLOB としてホストされている XML にアクセスする方法) に遭遇することはないと思います。ただし、ページが https 経由で提供され、http 経由で静的リソースを参照する場合、ユーザーは混合コンテンツ (保護されたコンテンツと保護されていないコンテンツ) のメッセージを受け取る可能性があります。

誰かが悪意を持って私たちのイメージを叩こうとした場合、お金が漏れる脆弱性 (ほとんどは 20kb 未満)?

http://www.windowsazure.com/en-us/pricing/details/#header-11で送信帯域幅の料金を確認してください。現在、Windows Azure では、最大 5 GB のデータ転送が無料で、1 GB あたり 0.12 ドルと非常に安いプロモーションを実施しています。また、非常に安価なストレージ トランザクションも考慮する必要があります。私はそれについてあまり心配しません。最悪のシナリオでは、いつでも Shared Access Signature に戻して、リソースを保護できます。

ディレクトリ命名規則を使用して (VS2010 + Azure SDK から) BLOB コンテナーにファイルをアップロードする方法を理解するのに苦労しているので、何千ものパス参照を書き換える必要はありませんか? ディレクトリが BLOB コンテナーの抽象的な概念であることは理解していますが、コードでこれを模倣するためにスラッシュを使用してファイルを記述できます。明らかに、Windows では、Visual Studio にアップロードする前にこれを行うことはできません。

BLOB ストレージにアップロードするときに、ローカル コンピューターのフォルダー構造を保持するために使用できるサード パーティ ツールが多数あります。Windows Azure ストレージ チームのブログ投稿 ( http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx ) をご覧ください。明らかに、私の個人的なお気に入りは Cerebrata の Cloud Storage Studio です :) [私はその製品の開発者の 1 人です]

于 2013-03-05T13:53:53.517 に答える
4

パッケージのサイズが大きくなりすぎた場合は、大きな単一のパッケージ ファイルではなく、スタンドアロン ファイルを展開することでメリットが得られる可能性があります。少なくとも Visual Studio 2012 では、発行ウィザードに次の配置オプションが追加されました。

  • Web Deploy (これをお勧めします)
  • ウェブ配置パッケージ
  • FTP
  • ファイルシステム

私の知る限り、Web Deployはソースファイルとターゲットファイルを比較し、異なるファイルのみを物理的に転送します(おそらくファイルハッシュを比較しますが、内部についてはわかりません)。

とにかく、私はあなたの質問を解決するためにもう少し情報を提供しようとします:

サイトの 80% は HTTPS 環境で実行されています。ブロブ ストア内の画像にアクセスすると、クロス スクリプトの問題が発生しますか?

Gaurav Mantri は既にこれに回答していますが、もう少し最新の情報を提供するために、Azure CDN へのアクセスで HTTPS がサポートされるようになったため、Mixed Content メッセージを回避できます。(カスタム ドメイン/SSL 証明書のサポートは保留中です (最新情報を含む UserVoice リクエストはこちら)。

ちなみに、プロトコルのない規則 ( ://{domain}/{relative path}) を使用すると、ブラウザはベース ドキュメントとまったく同じプロトコル HTTP または HTTPS を使用します。

ディレクトリ命名規則を使用して (VS2010 + Azure SDK から) BLOB コンテナーにファイルをアップロードする方法を理解するのに苦労しているので、何千ものパス参照を書き換える必要はありませんか? ディレクトリが BLOB コンテナーの抽象的な概念であることは理解していますが、コードでこれを模倣するためにスラッシュを使用してファイルを記述できます。明らかに、Windows では、Visual Studio にアップロードする前にこれを行うことはできません。

静的ファイルを BLOB に同期する

静的ファイルを同期するためのスクリプト可能なオプションの 1 つは、AZCopyツールです。

別の方法は、このpowershell スクリプトです (この投稿の詳細情報)。要約すると、次のようになります。

  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 
        } 
    

CDN アセットの参照

解決すべきもう 1 つの問題は、相対ファイルではなく、CDN 上のファイルを参照する方法です。さまざまなソリューションがあり、そのほとんどはヘルパー関数を使用して相対パスに適切なプレフィックスを挿入します (次の質問に対するいくつかの回答が役立ちます: ASP.NET MVC Relative Paths )。

CDN アセットの URL を一元的に構築する方法をお勧めします。ある種のキャッシュ キラーを実装することもできます (そのためには、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);
}

アプリ設定:

<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">
于 2015-05-19T12:37:50.913 に答える