- Введение
- Создание Storage account
- Настройка Azure CDN
Content Delivery Network (CDN) — система распределенных (географически, по различным дата-центрам) серверов, которые доставляют веб-страницы и другой контент пользователю, основываясь на его местоположении, с ближайшего к нему сервера, входящего в CDN.
Принцип его работы:
- Пользователь запрашивает файл (или asset) через специальный URL, который выглядит как <endpointname>.azureedge.net. DNS перенаправляет запрос к Point-of-Presence (POP), в который входят Edge servers («пограничные сервера»), как правило — к наиболее близкорасположенному георграфически.
- Если на POP нет запрашиваемого файла — он будет запрошен с origin-ресурса. Таким ресурсом может быть Azure WebApp, Azure Cloud Service, Azure Storage account или любой веб-сервер на другой площадке.
- Origin-хост передает файл на сервер в CDN, включая дополнительные заголовки, которые описывают TTL (Time To Live) этого файла.
- Сервер в CDN кеширует файл у себя и передаёт его пользователю. Файл остается на сервере, пока не истечет TTL. Если не указано другое значеине — то используется 7 дней.
Предполагается, что имеется Azure WebApp с запущенным WordPress, как это описано в посте Azure: App Service – деплой WordPress.
Задача — использовать Azure Blob Storage для хранения статического контента, который будет отдаваться клиентам через CDN.
Содержание
Создание Storage account
Логинимся:
$ azure login
Проверяем подписку:
$ azure account list info: Executing command account list data: Name Id Current State data: ------------- ------------------------------------ ------- -------- data: Free Trial 97214f99-***-715556cd5906 false Enabled data: Pay-As-You-Go fe37db50-***-66145cdbd735 false Disabled data: Pay-As-You-Go 0a4f2b9c-***-40b17ef8c3ab true Enabled
Переключюаем на нужную:
$ azure account set 97214f99-***-715556cd5906 info: Executing command account set info: Setting subscription to "Free Trial" with id "97214f99-***-715556cd5906". info: Changes saved
Выбиарем группу ресурсов:
$ azure group list info: Executing command group list + Listing resource groups data: Name Location Provisioning State Tags: data: ---------------------- ---------- ------------------ ----- data: CDN_testing westus Succeeded null data: D2 westeurope Succeeded null data: Default-Storage-EastUS eastus Succeeded null
Тут уже имеется группа CDN_testing, которая создана как раз для CDN — используем её.
Создаем аккаунт в этой группе:
$ azure storage account create cdntesting -l westeurope --type RAGRS -g CDN_testing info: Executing command storage account create + Creating storage account
Получаем Access key
:
$ azure storage account keys list cdntesting -g CDN_testing info: Executing command storage account keys list + Getting storage account keys data: Primary: dAeA***9J8Q== data: Secondary: Da4u***HGbw==
Настраиваем подключение:
$ export AZURE_STORAGE_ACCESS_KEY=dAeA***9J8Q== $ export AZURE_STORAGE_ACCOUNT=cdntesting
Создаем контейнер:
$ azure storage container create static info: Executing command storage container create + Creating storage container static + Getting Storage container information data: { data: name: 'static', data: metadata: {}, data: etag: '"0x8D36D0BAFDF3E38"', data: lastModified: 'Mon, 25 Apr 2016 13:15:35 GMT', data: leaseStatus: 'unlocked', data: leaseState: 'available', data: requestId: '4e8c7222-0001-0025-64f4-9ef326000000', data: publicAccessLevel: 'Off' data: }
Открываем доступ:
$ azure storage container set --container static -p Blob info: Executing command storage container set + Set container + Getting Storage container information data: { data: name: 'static', data: metadata: {}, data: etag: '"0x8D36D0BC7B835B7"', data: lastModified: 'Mon, 25 Apr 2016 13:16:15 GMT', data: leaseStatus: 'unlocked', data: leaseState: 'available', data: requestId: '411213fb-0001-00ba-4af4-9e8b9c000000', data: publicAccessLevel: 'Blob' data: }
Загружаем файл:
$ file /hazure storage blob upload '/home/setevoy/Pictures/RTFM/netdata.png' static info: Executing command storage blob upload + Checking blob netdata.png in container static + Uploading /home/setevoy/Pictures/RTFM/netdata.png to blob netdata.png in container static Percentage: 100.0% (257.70KB/257.70KB) Average Speed: 257.70KB/S Elapsed Time: 00:00:00 + Getting Storage blob information data: Property Value data: ------------- ------------------------ data: container static data: blob netdata.png data: blobType BlockBlob data: contentLength 263883 data: contentType image/png data: contentMD5 F4VN9vUYRLxBQmJqMVOc3w==
Проверяем:
$ curl http://-sr 0-1024 http://cdntesting.blob.core.windows.net/static/netdata.png �PNG ▒ IHDR�o�T�d�IT ...
Работает.
Добавляем пост в блог с URL-ом этого файла:
Настройка Azure CDN
Переходим в Azure Portal > New > Media + CDN и создаем новый CDN профайл:
Далее — создаем CDN endpoint, который указывает на контейнер в Storage account-е. Для этого переходим в CDN profiles > <имя_профайла> > Settings > Endpoints > Add:
Тут:
- Name: будет составлять URL, например — cdnteseting.azureedge.net;
- Origin type: Storage (к чему привыязываем запись);
- Origin hostname: выбираем созданный Storage account;
- Origin path: необязательное поле, но укажем тут имя контейнера
/static
;
Несколько минут — и новый endpoint готов:
Для того, что бы CDN заработал — может потребоваться до 90 минут, и в это время мы будем получать ошибку 404:
$ curl -sr 0-1024 http://cdnteseting.azureedge.net/netdata.png <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html>
Спустя примерно 50 минут — файл стал доступен:
$ curl -sr 0-1024 http://cdnteseting.azureedge.net/netdata.png �PNG ▒ IHDR�o�T�d�IT pHYs� ...
Возвращаемся к посту в WP, и добавляем вторую картинку:
Проверяем:
Справа первым идет файл с http://cdntesting.blob.core.windows.net/static/netdata.png и временем 328мс, а вторым — http://cdnteseting.azureedge.net/netdata.png, с временем 179мс.
Другой способ проверить — с помощью curl
, как описано в посте curl: отобразить время ответа.
Создаем файл, напрмиер — cu.txt, с таким сождержимым:
time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_pretransfer: %{time_pretransfer}\n time_redirect: %{time_redirect}\n time_starttransfer: %{time_starttransfer}\n ----------\n time_total: %{time_total}\n
И выполняем GET
к ресурсам:
$ curl -w "@cu.txt" -o /dev/null -s http://cdntesting.blob.core.windows.net/static/netdata.png time_namelookup: 0,061 time_connect: 0,103 time_appconnect: 0,000 time_pretransfer: 0,103 time_redirect: 0,000 time_starttransfer: 0,186 ---------- time_total: 0,878
$ curl -w "@cu.txt" -o /dev/null -s http://cdnteseting.azureedge.net/netdata.png time_namelookup: 0,004 time_connect: 0,038 time_appconnect: 0,000 time_pretransfer: 0,038 time_redirect: 0,000 time_starttransfer: 0,074 ---------- time_total: 0,182
P.S. Azure CDN и gzip
— это вообще отдельная песня. Если столкнетесь с тем, что добавленные вручную mime-типы не отдаются в gzip
— подождите час-полтора, как это надо делать после добавления entrypoint.
Ссылки по теме
Serve Content from Azure CDN in Your Web Application
Improving WordPress Performance – Use Azure CDN