Шаблон размещения статического содержимого

Хранилище Azure

Разверните статическое содержимое в облачной службе хранения для предоставления непосредственно клиенту. Это позволяет снизить потребность в использовании дорогостоящих вычислительных экземпляров.

Контекст и проблема

Как правило, веб-приложения содержат элементы статического содержимого. Это статическое содержимое может включать HTML-страницы и другие ресурсы, такие как изображения и документы, доступные для клиента либо в составе HTML-страниц (например, встроенные изображения, таблицы стилей и клиентские файлы JavaScript), либо как отдельно загружаемые страницы (например, PDF-документы).

Хотя веб-серверы и оптимизированы для динамического отображения и кэширования вывода, они по-прежнему должны обрабатывать запросы на скачивание статического содержимого. Для этого задействуются циклы обработки, которые могли бы использоваться для других задач.

Решение

В большинстве сред облачного размещения вы можете поместить отдельные ресурсы и статические страницы приложения в службу хранилища. Служба хранилища может обрабатывать запросы для этих ресурсов, уменьшая нагрузку на вычислительные ресурсы, обрабатывающие другие веб-запросы. Как правило, облачные хранилища намного дешевле, чем вычислительные экземпляры.

Основные проблемы при размещении некоторых частей приложения в службе хранения связаны c развертыванием приложения и защитой ресурсов, которые не должны быть доступны для анонимных пользователей.

Проблемы и рекомендации

При принятии решения о реализации этого шаблона необходимо учитывать следующие моменты.

  • Размещенная служба хранения должна предоставлять конечную точку HTTP, к которой пользователи смогут получать доступ для скачивания статических ресурсов. Некоторые службы хранения также поддерживают протокол HTTPS, что позволяет размещать в службах хранения ресурсы, для которых требуется протокол SSL.

  • Если требуется обеспечить максимальную производительность и доступность, рекомендуем использовать сеть доставки содержимого (CDN) для кэширования содержимого контейнера хранилища в нескольких центрах обработки данных по всему миру. Но за использование CDN может взиматься плата.

  • Как правило, учетные записи хранения являются геореплицируемыми по умолчанию. Это позволяет обеспечить устойчивость при возникновении событий, которые могут повлиять на работу центра обработки данных. Это означает, что IP-адрес может измениться, но URL-адрес останется тем же.

  • Когда одна часть содержимого находится в учетной записи хранения, а другая — в размещенном вычислительном экземпляре, развертывание и обновление приложения усложняется. Вам может потребоваться выполнить отдельные развертывания, а также версии приложения и содержимого, чтобы упростить управление им, особенно если статическое содержимое включает файлы скриптов или компоненты пользовательского интерфейса. Но если требуется обновить только статические ресурсы, их можно просто отправить в учетную запись хранения, не развертывая пакет приложения повторно.

  • Службы хранения могут не поддерживать пользовательские доменные имена. В этом случае необходимо указать полный URL-адрес ресурсов в ссылках, так как они будут находиться в другом домене от динамического созданного содержимого, содержащего ссылки.

  • Контейнеры хранилища должны быть настроены для открытого доступа на чтение. Но обязательно убедитесь, что они не настроены для открытого доступа на запись, чтобы пользователи не могли отправлять содержимое.

  • Для управления доступом к ресурсам, которые не должны быть доступны анонимно, рекомендуется использовать ключ ограниченного доступа или маркер проверки подлинности. Дополнительные сведения см. в описании шаблона ключа ограниченного доступа.

Когда следует использовать этот шаблон

Этот шаблон можно использовать для следующих целей:

  • Сокращение затрат на размещение веб-сайтов и приложений, которые содержат некоторые статические ресурсы.

  • Сокращение затрат на размещение веб-сайтов, которые содержат только статическое содержимое и ресурсы. В зависимости от возможностей системы хранилища поставщика услуг размещения можно разместить весь статический веб-сайт в учетной записи хранения.

  • Предоставление статических ресурсов и содержимого для приложений, выполняющихся в других средах размещения или на локальных серверах.

  • Расположение содержимого в нескольких географических областях с использованием сети CDN, которая позволяет кэшировать содержимое учетной записи хранения в нескольких центрах обработки данных по всему миру.

  • Мониторинг затрат и использования пропускной способности. Использование отдельной учетной записи хранения для некоторого или всего статического содержимого позволяет легко отделить затраты на размещение и на среду выполнения.

Этот шаблон неприменим в следующих случаях:

  • Приложение должно выполнять обработку статического содержимого перед его доставкой клиенту. Например, может потребоваться добавить метку времени в документ.

  • Объем статического содержимого очень мал. Затраты на получение этого содержимого из отдельного хранилища могут превысить затраты на отделение содержимого от вычислительных ресурсов.

Проектирование рабочей нагрузки

Архитектор должен оценить, как шаблон размещения статического содержимого можно использовать в проектировании рабочей нагрузки для решения целей и принципов, описанных в основных принципах Платформы Azure Well-Architected Framework. Например:

Принцип Как этот шаблон поддерживает цели основных компонентов
Оптимизация затрат ориентирована на поддержание и улучшение рентабельности инвестиций рабочей нагрузки. Динамические узлы приложений обычно дороже статических узлов, так как динамические узлы могут выполнять закодированную бизнес-логику. Использование платформы приложений для доставки статического содержимого не является экономически эффективным.

- Затраты на co:09 Flow
- Затраты на co:10 Data
Эффективность производительности помогает рабочей нагрузке эффективно соответствовать требованиям путем оптимизации масштабирования, данных, кода. Отключение ответственности за внешний узел помогает снизить перегрузку и позволяет использовать платформу приложений только для доставки бизнес-логики.

- PE:07 Код инфраструктуры

Как и любое решение по проектированию, рассмотрите любые компромиссы по целям других столпов, которые могут быть представлены с этим шаблоном.

Пример

Служба хранилища Azure поддерживает обслуживание статического содержимого непосредственно из контейнера хранилища. Файлы обслуживаются путем выполнения анонимных запросов на доступ. По умолчанию файлы имеют URL-адрес в поддомене core.windows.net, например https://contoso.z4.web.core.windows.net/image.png. Вы можете настроить пользовательское доменное имя и использовать Azure CDN для доступа к файлам по протоколу HTTPS. Дополнительные сведения см. в руководстве по размещению статических веб-сайтов в службе хранилища Azure.

Доставка статических частей приложения непосредственно из службы хранения

Размещение статического веб-сайта обеспечивает анонимный доступ к файлам. Если необходимо контролировать доступ пользователей к файлам, можно поместить файлы в хранилище BLOB-объектов Azure, а затем создать подписанные URL-адреса для ограничения доступа.

В ссылках на страницах, которые доставляются клиенту, должен указываться полный URL-адрес ресурса. Если ресурс защищен с помощью ключа ограниченного доступа, например подписанного URL-адреса, он должен включаться в URL-адрес.

Пример приложения, в котором продемонстрировано использование внешнего хранилища для статических ресурсов, доступен на сайте GitHub. В этом примере используются файлы конфигурации, чтобы указать учетную запись хранения и контейнер, в котором хранится статическое содержимое.

<Setting name="StaticContent.StorageConnectionString"
         value="UseDevelopmentStorage=true" />
<Setting name="StaticContent.Container" value="static-content" />

Класс Settings в файле Settings.cs проекта StaticContentHosting.Web содержит методы для извлечения этих значений и создания строкового значения, содержащего URL-адрес контейнера облачной учетной записи хранения.

public class Settings
{
  public static string StaticContentStorageConnectionString {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue(
                              "StaticContent.StorageConnectionString");
    }
  }

  public static string StaticContentContainer
  {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue("StaticContent.Container");
    }
  }

  public static string StaticContentBaseUrl
  {
    get
    {
        var blobServiceClient = new BlobServiceClient(StaticContentStorageConnectionString);

        return string.Format("{0}/{1}", blobServiceClient.Uri.ToString().TrimEnd('/'), StaticContentContainer.TrimStart('/'));
    }
  }
}

Класс StaticContentUrlHtmlHelper в файле StaticContentUrlHtmlHelper.cs предоставляет метод StaticContentUrl, который создает URL-адрес, содержащий путь к облачной учетной записи хранения, если переданный в нее URL-адрес начинается с символа (~) пути к корневой папке ASP.NET.

public static class StaticContentUrlHtmlHelper
{
  public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
  {
    if (contentPath.StartsWith("~"))
    {
      contentPath = contentPath.Substring(1);
    }

    contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
                                contentPath.TrimStart('/'));

    var url = new UrlHelper(helper.ViewContext.RequestContext);

    return url.Content(contentPath);
  }
}

Файл Index.cshtml в папке Views\Home содержит элемент изображения, использующего метод StaticContentUrl для создания URL-адреса для его атрибута src.

<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />

Следующие шаги

  • Шаблон ключа камердинера. Если целевые ресурсы не должны быть доступными для анонимных пользователей, используйте этот шаблон, чтобы запретить прямой доступ.
  • Бессерверное веб-приложение в Azure. Эталонная архитектура, в которой реализовано бессерверное веб-приложение путем размещения статического веб-сайта с помощью Функций Azure.