Аналогично хостингу сайтов в AWS S3 — Azure предоставляет аналогичную возможность размещения статичных сайтов используя Blob Storage Account.
У Azure (внезапно) есть два существенных отличия/недостатка:
- данные сайта загружаются в контейнер, расположенный в Storage Account, и имя контейнера потом видно в URL. Т.е. если есть аккаунт example, и контейнер website — то URL будет выглядеть как https://example.blob.core.windows.net/website/
- Azure не поддерживает указание документа по умолчанию. Т.е. если пользователь приходит на https://example.blob.core.windows.net/ без указания конкретного файла — он получает ошибку InvalidQueryParameterValue.
Если первая проблема решается с помощью контейнера с именем $root — то вторую придётся разруливать через NGINX.
Создаём Storage Account:
[simterm]
$ azure storage account create japanwebistedev -l westeurope -g jm-japan-webiste --sku-name RAGRS --kind BlobStorage --access-tier Hot info: Executing command storage account create + Checking availability of the storage account name + Creating storage account info: storage account create command OK
[/simterm]
Для дальнейшей работы — получаем ключи авторизации:
[simterm]
$ azure storage account keys list -g jm-japan-webiste japanwebistedev info: Executing command storage account keys list + Getting storage account keys data: Name Key Permissions data: ---- ---------------------------------------------------------------------------------------- ----------- data: key1 Gt7***t0g== Full data: key2 N6N***rJw== Full info: storage account keys list command OK
[/simterm]
Задаём переменные:
[simterm]
$ export AZURE_STORAGE_ACCESS_KEY=Gt7***t0g== $ export AZURE_STORAGE_ACCOUNT=japanwebistedev
[/simterm]
Сейчас в аккаунте нет контейнеров:
[simterm]
$ azure storage container list info: Executing command storage container list + Getting storage containers info: No containers found info: storage container list command OK
[/simterm]
Создаём контейнер типа Blob с именем $root:
[simterm]
$ azure storage container create --container '$root' -p Blob
info: Executing command storage container create
+ Creating storage container $root
+ Getting storage container information
data: {
data: name: '$root',
data: metadata: {},
data: etag: '"0x8D49DDED5CE94E1"',
data: lastModified: 'Thu, 18 May 2017 11:12:56 GMT',
data: lease: { status: 'unlocked', state: 'available' },
data: requestId: '940648ea-0001-00cb-66c7-cfbc6c000000',
data: publicAccessLevel: 'Blob'
data: }
info: storage container create command OK
[/simterm]
Загружаем индексный файл:
[simterm]
$ azure storage blob upload '/home/setevoy/index.html' '$root' info: Executing command storage blob upload + Checking blob index.html in container $root + Uploading /home/setevoy/index.html to blob index.html in container $root Percentage: 100.0% (21.00B/21.00B) Average Speed: 21.00B/s Elapsed Time: 00:00:00 + Getting storage blob information data: Property Value data: ------------- ------------------------ data: container $root data: name index.html data: blobType BlockBlob data: contentLength 21 data: contentType text/html data: contentMD5 TXAn2/9C+Sdw7AFDSI9Neg== info: storage blob upload command OK
[/simterm]
Проверяем:
[simterm]
$ curl https://japanwebistedev.blob.core.windows.net/index.html Test Site index page
[/simterm]
Работает, без указания контейнера — ОК, хорошо.
Далее требуется подключить кастомный домен и настроить документ по умолчанию.
Как и везде в Azure — добавление кастомных доменов к сервисам выполняется через CNAME или *verify записи, а для того что бы решить проблему с индексным файлом — домен и его www субдомены направлены на прокси:
[simterm]
$ dig @ns1-07.azure-dns.com dev-jp.domain.tld +short 40.***.***.168 $ dig @ns1-07.azure-dns.com www.dev-jp.domain.tld +short 40.***.***.168
[/simterm]
Для подключения этих записей к Storage Account-у — требуется ещё две записи:
[simterm]
$ dig @ns1-07.azure-dns.com asverify.dev-jp.domain.tld +short asverify.japanwebistedev.blob.core.windows.net. $ dig @ns1-07.azure-dns.com asverify.www.dev-jp.domain.tld +short asverify.japanwebistedev.blob.core.windows.net.
[/simterm]
Подробнее — тут>>>.
Подключаем к аккаунту:
[simterm]
$ azure storage account set japanwebistedev --subdomain asverify.dev-jp.domain.tld -g jm-japan-webiste info: Executing command storage account set + Updating storage account error: Request must specify an account property to update. error: Error information has been recorded to /home/setevoy/.azure/azure.err error: storage account set command failed
[/simterm]
#&%S&c#*&%8, Azure!!!!
Добавляем домен руками через Portal:
Настраиваем простой редирект на прокси/NGINX:
server {
server_name dev-jp.domain.tld;
rewrite ^ http://www.dev-jp.domain.tld$request_uri permanent;
}
server {
server_name www.dev-jp.domain.tld;
access_log /var/log/nginx/dev-jp.domain.tld-access.log;
error_log /var/log/nginx/dev-jp.domain.tld-error.log;
root /usr/share/nginx/html;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://japanwebistedev.blob.core.windows.net$request_uri;
}
}
Проверяем:
[simterm]
$ curl -L dev-jp.domain.tld/index.html Test Site index page $ curl -L www.dev-jp.domain.tld/index.html Test Site index page
[/simterm]
И последнее, что надо сделать — проверять наличие $request_uri: если URI присутсвует — использовать его, если нет — то дописывать index.html.
Обновляем конфиг NGINX:
server {
server_name dev-jp.domain.tld;
rewrite ^ http://www.dev-jp.domain.tld$request_uri permanent;
}
server {
server_name www.dev-jp.domain.tld;
access_log /var/log/nginx/dev-jp.domain.tld-access.log;
error_log /var/log/nginx/dev-jp.domain.tld-error.log;
root /usr/share/nginx/html;
rewrite ^(/)$ /index.html permanent;
resolver 8.8.8.8;
location ~ / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://japanwebistedev.blob.core.windows.net$request_uri;
}
}
Проверяем:
[simterm]
$ curl -L dev-jp.domain.tld Test Site index page $ curl -L dev-jp.domain.tld/ Test Site index page $ curl -L www.dev-jp.domain.tld Test Site index page $ curl -L www.dev-jp.domain.tld/ Test Site index page
[/simterm]
Готово.





