Автор статьи: Рустем Галиев
IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM
Привет, Хабр!
В мире быстро развивающихся технологий быстродействие и доступность играют ключевую роль в обеспечении удовлетворения потребностей пользователей. В этой эпохе, где каждая миллисекунда имеет значение, использование современных инструментов для оптимизации скорости доставки контента становится неотъемлемой частью стратегии любого онлайн-проекта. Сети доставки контента (CDN) представляют собой одно из ключевых решений для сокращения времени загрузки и улучшения доступности контента для глобальных аудиторий.
В контексте облачных вычислений Microsoft Azure предоставляет мощный инструментарий для эффективной реализации CDN. Путем распределения контента по всему миру с использованием глобальной сети серверов, CDN в Azure позволяет организациям улучшить производительность, снизить задержки и обеспечить надежную доставку контента пользователям в любой точке земного шара.
В данной статье мы рассмотрим основные принципы работы CDN в Microsoft Azure, его особенности, преимущества и способы эффективного использования для оптимизации процесса доставки контента, улучшения пользовательского опыта и повышения конкурентоспособности онлайн-платформ.
Немного брифинга в CDN
Сеть доставки контента (Content Delivery Network, CDN) - это географически распределенная система серверов, которая работает с целью улучшения скорости и эффективности доставки контента до конечных пользователей через интернет. Основная идея CDN заключается в том, чтобы поместить копии контента (например, изображения, видео, статические файлы, HTML-страницы) на серверы, распределенные по разным точкам мира.
Когда пользователь запрашивает доступ к определенному контенту, CDN автоматически выбирает сервер, который физически находится ближе к пользователю или имеет более быстрый доступ к нему. Это позволяет уменьшить задержки загрузки, улучшить производительность и снизить нагрузку на исходный сервер, что особенно важно при работе с большими объемами трафика или при наличии пользователей из разных частей мира.
Основные компоненты CDN включают в себя:
Edge серверы: Распределенные серверы, которые хранят кэшированные копии контента и обслуживают запросы от пользователей в их регионах.
Оптимизацию маршрутизации: CDN использует оптимизированные маршруты доставки, чтобы контент достигал конечного пользователя по кратчайшему пути.
Кэширование: CDN кэширует контент на своих серверах, уменьшая необходимость постоянного обращения к исходному серверу для получения информации.
SSL-шифрование и безопасность: Многие CDN предоставляют уровень защиты контента, включая SSL-шифрование и защиту от DDoS-атак.
Аналитику и мониторинг: CDN обеспечивает возможность отслеживания статистики использования, что позволяет оптимизировать работу и контролировать нагрузку на серверы.
Применение CDN широко распространено в сфере онлайн-сервисов, электронной коммерции, медиа и различных типов веб-сайтов, где скорость загрузки и доступность контента являются ключевыми факторами для обеспечения удовлетворения пользовательских потребностей.
Azure CDN (Content Delivery Network) - это служба в облаке Microsoft Azure, предназначенная для улучшения скорости загрузки и доступности контента для пользователей по всему миру. Она работает на базе глобальной сети распределенных узлов, называемых "конечными точками", которые кэшируют содержимое и обслуживают запросы пользователей.
Основные компоненты и функции Azure CDN:
-
Конечные точки (Endpoints):
Azure CDN поддерживает различные типы конечных точек: Standard, Premium, а также конечные точки для приложений (Web Application Firewall, WAF).
Конечные точки определяют набор правил и параметров, определяющих поведение CDN для доставки контента.
-
Распределенные узлы (PoPs - Points of Presence):
Это серверы, размещенные в разных регионах мира, которые кэшируют контент и обрабатывают запросы пользователей.
При запросе контента пользователем CDN выбирает наиболее близкий по расположению узел для ускорения доставки.
-
Поддержка различных типов контента:
Azure CDN может работать с разнообразными типами контента, включая статические ресурсы (изображения, CSS, JavaScript), динамически формируемые страницы, видео и потоковые данные.
-
Управление кэшем и настройки кэширования:
Пользователи могут настраивать правила кэширования для оптимизации хранения и использования копий контента на узлах CDN.
Возможность определения времени жизни кэша, инвалидации содержимого, предварительной загрузки данных в кэш и других параметров.
-
Интеграция с другими сервисами Azure:
Azure CDN может интегрироваться с другими сервисами Azure, такими как Azure Blob Storage, Azure Web Apps и Content Management Systems (CMS), облегчая доставку контента из различных источников.
-
Безопасность и защита:
Поддержка HTTPS для защищенной доставки контента и встроенные функции безопасности, такие как Azure Web Application Firewall (WAF) для защиты от веб-атак.
-
Аналитика и мониторинг:
Предоставление инструментов для мониторинга производительности CDN, отслеживания использования, анализа логов и статистики для оптимизации работы и улучшения производительности.
Начнем с простого, создадим ресурс CDN.
Логинимся в Azure:
az login -u $username -p $password
Создаем наш ресурс:
az cdn profile create --sku Standard_Microsoft --name $cdnName --resource-group $resource --location eastus
Вот основные параметры команды:
--name
: имя профиля CDN.--resource-group
: родительская группа ресурсов для профиля CDN.--sku
: ценовая категория, также определяет поставщика CDN. На момент создания доступны следующие параметры:Custom_Verizon
,Premium_Verizon
,StandardPlus_955BandWidth_ChinaCdn
,StandardPlus_AvgBandWidth_ChinaCdn
,StandardPlus_ChinaCdn
,Standard_955BandWidth_ChinaCdn
,Standard_Akamai
,Standard_AvgBandWidth_ChinaCdn
,Standard_ChinaCdn
,Standard_Microsoft
иStandard_Veri
.Значение по умолчанию —Standard_Akamai
.
Подождите, пока команда завершится успешно.
На следующем шаге мы будем использовать Azure CLI для подтверждения создания профиля Azure CDN.
Используем следующую команду, чтобы подтвердить, что профиль Azure CDN был успешно создан.
az cdn profile show --resource-group $resource --name $cdnName --query "{Name: name, Sku: sku.name"}
Также обратите внимание, что переменная среды $resource
содержит имя выделенной вам группы ресурсов Azure.
Вы также можете использовать команду list, чтобы получить список всех профилей CDN в вашей группе ресурсов:
Проверим, что все было создано в WebUI:
Теперь поработаем с созданием CDN Endpoint.
Мы используем следующую команду, чтобы добавить новую конечную точку CDN в наш профиль CDN:
az cdn endpoint create --origin www.microsoft.com --profile-name $cdnName --name $endpointName --origin-host-header www.microsoft.com --resource-group $resource
Вот основные параметры команды:
--origin
: исходный веб-сайт, который мы хотим кэшировать в Azure CDN. Это веб-сайт, который вы планируете предоставить своим клиентам по всему миру.--origin-host-header
: значение этого параметра должно соответствовать значению заголовка HTTP HOST вашего источника.--profile-name
: родительский профиль CDN.--name
: Имя новой конечной точки.--resource-group
: имя группы ресурсов профиля CDN.
Мы используем следующую команду, чтобы подтвердить, что конечная точка CDN была успешно создана:
az cdn endpoint show --resource-group $resource --name $endpointName --profile-name $cdnName --query "{Name: name, Origin: origins[0].hostName, URL: hostName}"
Вы также увидите URL-адрес конечной точки (имя хоста), который ваши клиенты могут использовать для доступа к кэшированному исходному сайту.
Мы также можем использовать команду list для вывода списка всех доступных конечных точек для профиля CDN:
Проверим ресурс в WebUI:
Давайте заапдейтим наш CDN.
Мы используем следующую команду, чтобы обновить наш профиль CDN, добавив в него новый тег таксономии.
az cdn profile update --name $cdnName --resource-group $resource --tags env=dev
Теперь мы используем следующую команду, чтобы обновить конечную точку нашего профиля CDN, отключив небезопасный HTTP-трафик, включив сжатие контента и гарантируя, что кеширование игнорирует строки запроса:
az cdn endpoint update --resource-group $resource --profile-name $cdnName --name $endpointName --no-http true --enable-compression true --query-string-caching IgnoreQueryString
--no-http
: разрешает/запрещает небезопасный HTTP-трафик; в случае отказа ваши клиенты CDN должны использовать HTTPS.--enable-compression
: включить или отключить сжатие контента. Вы также можете выбрать, какие типы контента следует сжимать, используя параметр--content-types-to-compress
.
Вы также можете обновить следующие свойства для своей конечной точки:
--no-https
: разрешает или запрещает HTTPS-трафик.--origin-host-header
: используйте этот параметр для обновления свойства origin-host-header.--origin-path
: обновить исходный путь для вашей конечной точки.
Проверим, что все было успешно
az cdn endpoint show --resource-group $resource --name $endpointName --profile-name $cdnName --query "{Name: name, IsHttpAllowed: isHttpAllowed, IsCompressionEnabled: isCompressionEnabled, ContentTypesToCompress: contentTypesToCompress, QueryStringCachingBehavior: queryStringCachingBehavior}"
Ну и под конец настроим Delivery Rules.
Используя этот механизм правил, вы можете добавить собственные правила (правила доставки) к конечной точке CDN и изменить способ обработки CDN трафика HTTP(S). Например, вы можете определить собственное правило для выполнения одного из следующих действий:
Изменить поведение кэширования для выбранных/всех страниц.
Перенаправить входящий запрос на нужный URL.
Добавить/обновить HTTP-запросы для входящего и исходящего трафика (запрос и ответ).
На этом этапе мы добавим новое правило доставки в нашу конечную точку CDN. Будем использовать следующую команду, чтобы добавить новое правило, которое перенаправляет весь входящий HTTP-трафик на эквивалентный HTTPS-трафик:
az cdn endpoint rule add --resource-group $resource --profile-name $cdnName --name $endpointName --order 1 --rule-name "customRule01" --match-variable RequestScheme --operator Equal --match-values HTTP --action-name "UrlRedirect" --redirect-protocol Https --redirect-type Moved
--order
: порядок правил. Правила с меньшим порядковым номером будут обработаны в первую очередь. Правило с порядком 0 является специальным правилом. Он не требует каких-либо условий, и действия, перечисленные в нем, будут применяться всегда.--rule-name
: имя правила, требуется только для Microsoft SKU.--action-name
: действие, которое вы добавляете в правило доставки. Допустимые значения: CacheExpiration, CacheKeyQueryString, ModifyRequestHeader, ModifyResponseHeader, OriginGroupOverride, UrlRedirect и UrlRewrite.--match-variable
: действия внутри правила выполняются только в том случае, если действие правила выполнено. В ваших условиях вы можете проверить следующие свойства HTTP: ClientPort, Cookies, HostName, HttpVersion, IsDevice, PostArgs, QueryString, RemoteAddress, RequestBody, RequestHeader, RequestMethod, RequestScheme, RequestUri, ServerPort, SocketAddr, SslProtocol, UrlFileExtension, UrlFileName и UrlPath..--match-values
: Соответствующие значения условия соответствия. В нашей команде мы проверяем, является ли протокол входящего запроса HTTP.--redirect-protoco
l: протокол, используемый для перенаправления. Допустимые значения: Http, Https и MatchRequest. Последний будет напоминать исходный протокол запроса.--redirect-type
: тип перенаправления, которое правило будет использовать при перенаправлении трафика. Допустимые значения: Found, Moved, PermanentRedirect и TemporaryRedirect. Каждый из них приведет к тому, что вызывающему абоненту/клиенту будет возвращен соответствующий код ответа HTTP.
Проверим, что все добавилось
az cdn endpoint rule show --resource-group $resource --name $endpointName --profile-name $cdnName --query "{Name: name, Rules: deliveryPolicy.rules, Endpoint: hostName}"
И теперь предварительная загрузка и очистка контента CDN.
Так зачем же вам нужно предварительно загружать или очищать содержимое конечной точки CDN?
По умолчанию ресурсы кэшируются конечными точками CDN при первом запросе. Это означает, что первый запрос на некэшированный контент будет перенаправлен на исходный сервер, что замедляет первый вызов с точки зрения клиента. Чтобы избежать этой задержки первого попадания, вы можете предварительно загрузить свои ресурсы в конечную точку CDN. Это обеспечит лучшее качество обслуживания клиентов, а также уменьшит сетевой трафик на ваших исходных серверах.
Ресурсы контента конечной точки CDN будут оставаться в кэше до истечения срока жизни (TTL) ресурса. По истечении срока жизни актива новый актив будет получен с исходного сервера и отправлен пользователям. Вы можете очистить содержимое конечной точки CDN до истечения срока жизни, чтобы новый контент извлекался/загружался с исходного сервера.
az cdn endpoint show --resource-group $resource --name $endpointName --profile-name $cdnName --query "{Name: name, Origin: origins[0].hostName, URL: hostName}"
С помощью следующей команды мы предварительно загрузим веб-страницу https://www.ibm.com/test/test.html в вашу конечную точку CDN:
az cdn endpoint load --resource-group $resource --profile-name $cdnName --name $endpointName --content-paths '/test/test.html'
--content-paths
определяет, какие ресурсы вы хотите предварительно загрузить в конечную точку CDN. Ссылка привязана к имени хоста исходного сервера.
Теперь давайте очистим тот же ресурс, который мы загрузили на предыдущем шаге:
az cdn endpoint purge --resource-group $resource --profile-name $cdnName --name $endpointName --content-paths '/test/test.html'
Использование Azure CDN помогает улучшить скорость загрузки контента, снизить нагрузку на исходные серверы и повысить доступность контента для пользователей по всему миру благодаря глобальной сети распределенных узлов.
Больше практических навыков по инструментам инфраструктуры вы сможете получить в рамках онлайн-курсов от моих коллег из OTUS. Заглядывайте в каталог и выбирайте подходящее направление.