Azure: CDN и Blob Storage

Автор: | 04/26/2016
 

azure_logo

  • Введение
  • Создание Storage account
  • Настройка Azure CDN

Content Delivery Network (CDN) — система распределенных (географически, по различным дата-центрам) серверов, которые доставляют веб-страницы и другой контент пользователю, основываясь на его местоположении, с ближайшего к нему  сервера, входящего в CDN.

Принцип его работы:

azure_cdn

  1. Пользователь запрашивает файл (или asset) через специальный URL, который выглядит как <endpointname>.azureedge.net. DNS перенаправляет запрос к Point-of-Presence (POP), в который входят Edge servers («пограничные сервера»), как правило — к наиболее близкорасположенному георграфически.
  2. Если на POP нет запрашиваемого файла — он будет запрошен с origin-ресурса. Таким ресурсом может быть Azure WebApp, Azure Cloud Service, Azure Storage account или любой веб-сервер на другой площадке.
  3. Origin-хост передает файл на сервер в CDN, включая дополнительные заголовки, которые описывают TTL (Time To Live) этого файла.
  4. Сервер в 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_wp_1

azure_cdn_wp_2

Настройка Azure CDN

Переходим в Azure Portal > New > Media + CDN и создаем новый CDN профайл:

azure_cdn_wp_3

azure_cdn_wp_4

Далее — создаем CDN endpoint, который указывает на контейнер в Storage account-е. Для этого переходим в CDN profiles > <имя_профайла> > Settings > Endpoints > Add:

azure_cdn_wp_5 azure_cdn_wp_5

Тут:

  • Name: будет составлять URL, например — cdnteseting.azureedge.net;
  • Origin type: Storage (к чему привыязываем запись);
  • Origin hostname: выбираем созданный Storage account;
  • Origin path: необязательное поле, но укажем тут имя контейнера /static;

azure_cdn_wp_6

Несколько минут — и новый endpoint готов:

azure_cdn_wp_7

Для того, что бы 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, и добавляем вторую картинку:

azure_cdn_wp_8

Проверяем:

azure_cdn_wp_9

Справа первым идет файл с 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

How to use Azure CDN

Improving WordPress Performance – Use Azure CDN

Azure: Blob storage