Подтвердить что ты не робот

Azure, лучший способ хранить и развертывать статический контент (например, images/css)?

Мы собираемся развернуть наше веб-приложение .NET на Azure Web Role. Мне просто интересно, как другие обрабатывали свой статический контент, в частности изображения и css? На данный момент наш пакет приложений составляет около 25 МБ, но 18 мб, который получен исключительно из изображений, таких как кнопки навигации, значки и компоненты шаблонов, которые редко когда-либо обновляются. Было бы разумно разбить это из пакета развертывания и переместить его в хранилище blob?

У меня есть несколько сомнений по поводу этого подхода, о котором мне интересно, действительны...

  • 80% нашего сайта работает в среде HTTPS. Будет ли доступ к изображениям в хранилище blob вводить проблемы с несколькими скриптами?

  • Уязвимость к утечке денег, если кто-то пытается злонамеренно забивать наши изображения (большинство из них менее 20kb)?

  • Я пытаюсь посмотреть, как можно загружать файлы в контейнер blob (из VS2010 + Azure SDK) с соглашением об именах каталогов, поэтому мне не нужно переписывать 1000 ссылок на пути? Я ценю, что каталоги являются абстрактным понятием в контейнерах blob, но я могу писать файлы с косой чертой, чтобы имитировать это в коде. Очевидно, что Windows не позволяет мне это делать, прежде чем я загружу в Visual Studio.

Любые мысли или альтернативные стратегии будут приветствоваться. Цель состоит в том, чтобы свернуть наш пакет развертывания, чтобы ускорить время развертывания. Также мне очень нравится идея выгрузки изображения, предназначенного для выделенного node, для повышения производительности на веб-сервере, возможно, моя коллекция изображений настолько мала, что ее вряд ли стоит беспокоить?

Обновление 16 мая ----------------------------------------- -------------------------------

Вот что я сделал в конце:

1. Передача всех изображений + css в контейнеры для хранения данных. Я поддерживал структуру любых подкаталогов в папках изображений и css.

2. Примените правило перезаписи URL в нашем файле web.config следующим образом.

  <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

При рассмотрении этого недавно я столкнулся с следующим руководством от Microsoft. Более подробно о том, как можно автоматизировать развертывание ваших активов и сжатие кеша с помощью запросов, можно.

Подавать контент с Azure CDN в веб-приложении

4b9b3361

Ответ 1

Некоторые комментарии:

Было бы разумным разбить это из пакета развертывания и перенести его в хранилище blob?

Совершенно верно. Я вижу много преимуществ:

  • Как вы упомянули, это значительно уменьшит размер вашего пакета, поэтому развертывание станет намного быстрее.
  • Опять же, как вы упомянули, это избавит вас от вашего веб-сервера, таким образом, сделает ваш сайт более отзывчивым.
  • Если вам нужно обновить изображения, js, css файлы, вы можете просто заменить эти файлы в хранилище blob. Если они оставлены в вашем пакете, вам нужно будет перераспределить ваш пакет.
  • Вы также можете воспользоваться Windows Azure CDN, который работает с хранилищем blob.

80% нашего сайта работает в среде HTTPS. Будет доступ к изображениям в в хранилище blob возникают проблемы с перекрестными сценариями?

Пока вы не читаете содержимое через AJAX, я не думаю, что вы столкнетесь с проблемами межсайтового сценария (Как получить доступ к XML, размещенному как azure blob from лазурный сайт). Однако, если ваша страница обслуживается через https и вы ссылаетесь на статические ресурсы через http, ваши пользователи могут получать смешанное содержимое (защищенное и необеспеченное) сообщение.

Уязвимость к утечке денег, если кто-то пытается злонамеренно забить наши изображения (большинство из них до 20кб)?

Посмотрите на стоимость исходящей полосы пропускания здесь: http://www.windowsazure.com/en-us/pricing/details/#header-11. В настоящее время в Windows Azure работает промоакция, где до 5 ГБ передачи данных бесплатно, а это 0,12 долл./ГБ, что довольно дешево. Вам также необходимо будет учитывать транзакции хранения, что также очень дешево. Я бы не стал слишком беспокоиться об этом. В худшем случае вы всегда можете вернуться к общей подписке доступа и защитить ресурсы.

Я пытаюсь посмотреть, как можно загружать файлы в blob контейнер (из VS2010 + Azure SDK) с соглашением об именах каталогов поэтому мне не нужно переписывать 1000 ссылок на пути? Я ценю каталоги являются абстрактным понятием в контейнерах blob, но я могу пишите файлы с косой чертой для имитации этого кода. очевидно Windows не позволяет мне это делать до того, как я загружу в Visual Studio.

Для вас доступно несколько сторонних инструментов, которые сохранят структуру папок вашего локального компьютера при загрузке в хранилище blob. Взгляните на это сообщение в блоге от команды Windows Azure Storage: http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx. Очевидно, моим личным фаворитом является Cloud Storage Studio от Cerebrata:) [Я один из разработчиков этого продукта]

Ответ 2

Если ваш пакет становится слишком большим по размеру, возможно, вам удастся использовать автономные файлы вместо большого файла с одним пакетом. По крайней мере, в Visual Studio 2012 мастер публикации имеет следующие варианты развертывания:

  • Веб-развертывание (я рекомендую это вам)
  • Пакет веб-развертывания
  • FTP
  • Файловая система

AFAIK, Web Deploy сравнивает исходные и целевые файлы, физически перенося только разные файлы (он, вероятно, сравнивает хэши файлов, но я не знаю о внутренних компонентах).

Во всяком случае, я постараюсь дать дополнительную информацию, чтобы решить ваши вопросы:

80% нашего сайта работает в среде HTTPS. Будет ли доступ к изображениям в хранилище blob внедрить проблемы с несколькими скриптами?

Gaurav Mantri уже ответил на это, но для предоставления немного более новой информации HTTPS теперь поддерживается для доступа к Azure CDN, поэтому вы можете избежать сообщения о смешанном контенте. (Все еще ожидает поддержки пользовательского сертификата домена /SSL (запрос UserVoice с последней информацией здесь).

Кстати, используя соглашение без протокола (://{domain}/{relative path}), браузер будет использовать в качестве базового документа точно тот же протокол HTTP или HTTPS.

Я пытаюсь посмотреть, как можно загружать файлы в контейнер blob (из VS2010 + Azure SDK) с соглашением об именах каталогов, поэтому мне не нужно переписывать 1000 ссылок на пути? Я ценю, что каталоги являются абстрактным понятием в контейнерах blob, но я могу писать файлы с косой чертой, чтобы имитировать это в коде. Очевидно, что Windows не позволяет мне это делать, прежде чем я загружу в Visual Studio.

Синхронизация статических файлов с blob

Один сценарий для синхронизации ваших статических файлов - это инструмент 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

Еще одна проблема, которую нужно решить, - как ссылаться на файлы на CDN, а не на относительные файлы. Существуют различные решения, большинство из которых используют вспомогательные функции для придания правильному префиксу относительного пути (некоторые ответы на следующий вопрос могут помочь вам: Относительные пути ASP.NET MVC).

Я предлагаю централизованный способ создания URL-адресов ресурсов 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">

Ответ 3

Если CDN или Blob Storage не являются параметрами, простой способ сделать файлы файлов в 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>