Служба приложений Azure на платформе Linux: вопросы и ответы

Примечание.

Статья была полезной? Ваши входные данные важны для нас. Нажмите кнопку "Отзывы" на этой странице, чтобы сообщить нам, насколько хорошо эта статья работала для вас или как мы можем улучшить ее.

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

Если у вас есть вопросы, задайте их в комментарии к этой статье.

Встроенные образы

Какие значения будут доступны в разделе "Загрузочный файл" при настройке стека времени выполнения?

Стек Ожидаемое значение
Java SE команда для запуска приложения JAR (например, java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat расположение скрипта для выполнения необходимых конфигураций (например, /home/site/deployments/tools/startup_script.sh)
Node.js файл конфигурации PM2 или ваш файл сценария
.NET Core имя скомпилированной библиотеки DLL в формате dotnet <myapp>.dll
PHP настраиваемый запуск (необязательно)
Python скрипт запуска (необязательно)
Ruby сценарий Ruby, с помощью которого вы хотите инициализировать приложение

Эти команды или скрипты выполняются после запуска встроенного контейнера Docker, но перед запуском кода приложения.

Управление

Что происходит при нажатии кнопки перезагрузки на портале Azure?

Это действие аналогично перезагрузке Docker.

Можно ли использовать Secure Shell (SSH) для подключения к виртуальной машине контейнера приложения?

Да, вы можете это сделать при помощи сайта системы управления версиями (SCM).

Примечание.

Можно также подключиться к контейнеру приложения непосредственно с локального компьютера разработки с помощью SSH, SFTP или Visual Studio Code (для динамической отладки приложений Node.js). См. дополнительные сведения об удаленной отладке и SSH в службе приложений в Linux.

Как создать план службы приложений Linux с помощью пакета SDK или шаблона Azure Resource Manager?

Задайте для поля reserved службы приложений значение true.

Непрерывная интеграция и развертывание

Мое веб-приложение по-прежнему использует старый образ контейнера Docker после обновления образа в Docker Hub. Поддерживается ли непрерывная интеграция и развертывание пользовательских контейнеров?

Да. Сведения о настройке непрерывной интеграции и развертывания для реестра контейнеров Azure или Docker Hub см. в статье Непрерывное развертывание с использованием платформы Azure "Веб-приложения для контейнеров". Для частных реестров контейнер можно обновить, остановив и снова запустив свое веб-приложение. Либо измените (добавьте) пустой параметр приложения, чтобы принудительно обновить контейнер.

Поддерживаются ли промежуточные среды?

Да.

Можно ли развернуть веб-приложение с помощью WebDeploy или MSDeploy?

Да. Для параметра WEBSITE_WEBDEPLOY_USE_SCM приложения необходимо задать значение false.

При использовании веб-приложения Linux произошел сбой развертывания Git моего приложения. Как обойти эту проблему?

В случае сбоя развертывания Git для веб-приложения Linux можно выбрать следующие варианты развертывания кода приложения:

  • Используйте функцию непрерывной поставки (предварительная версия). Чтобы использовать непрерывную поставку Azure, исходный код приложения можно хранить в репозитории Git для Azure DevOps или в репозитории GitHub. Дополнительные сведения см. в блоге Use Azure portal to setup Continuous Delivery for Web App On Linux (Настройка непрерывной доставки для веб-приложения на платформе Linux с помощью портала Azure).

  • Используйте API развертывания ZIP-файлов. Чтобы использовать этот API, установите SSH-подключение к веб-приложению и перейдите в папку, в которую требуется развернуть код. Выполните следующий код:

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    Если происходит ошибка и отображается сообщение о том, что команда curl не найдена, убедитесь, что вы установили curl с помощью команды apt-get install curl, прежде чем выполнили предыдущую команду curl.

Поддержка языков

Я хочу использовать WebSocket в своем приложении Node.js. Нужно ли для этого выбрать какие-либо специальные параметры или настройки?

Да. На сервере в коде Node.js нужно отключить perMessageDeflate. Например, если вы используете socket.io, примените следующий код:

const io = require('socket.io')(server,{
  perMessageDeflate :false
});

Поддерживаются ли некомпилированные приложения .NET Core?

Да.

Поддерживает ли Composer диспетчер зависимостей для приложений PHP?

Да. Во время развертывания Git сервер Kudu определяет развертывание приложения PHP (на основе файла composer.lock), после чего Kudu активирует установку Composer.

Пользовательские контейнеры

Можно ли использовать управляемые удостоверения в Службе приложений при извлечении образов из ACR?

Да, эта возможность доступна в Azure CLI. Можно использовать удостоверения, назначенные системой или пользователем. На портале Azure эти функции пока не поддерживаются.

Я использую собственный пользовательский контейнер. Мне нужно, чтобы платформа подключила общую папку SMB к каталогу "/home/".

Если значение для параметра WEBSITES_ENABLE_APP_SERVICE_STORAGE не задано или он имеет значение false, каталог /home/ не будет совместно использоваться масштабируемыми экземплярами, а записанный файл не сохранится в процессе перезапусков. Если явно присвоить параметру WEBSITES_ENABLE_APP_SERVICE_STORAGE значение true, будет активирована функция подключения. Если задано значение true, и вы хотите отключить подключение, необходимо явно задать для WEBSITES_ENABLE_APP_SERVICE_STORAGE значение false.

Не удается запустить контейнер с "не осталось места на устройстве". Что означает эта ошибка?

Служба приложений в Linux использует два разных типа хранилища:

  • Хранилище файловой системы: хранилище файловой системы включается в квоту плана Служба приложений. Он используется, когда файлы сохраняются в постоянном хранилище, корневом каталоге /home .
  • Место на диске узла: место на диске узла используется для хранения образов контейнеров. Она управляется платформой с помощью драйвера хранилища Docker.

Место на диске узла отделяется от квоты хранилища файловой системы. Для каждого экземпляра не поддерживается расширение, и для каждого экземпляра имеется ограничение в 15 ГБ. Он используется для хранения пользовательских образов в рабочей роли. Вы можете использовать более 15 ГБИТ/с в зависимости от точной доступности места на диске узла, но это не гарантируется.

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

Платформа обычно очищает место на диске узла, чтобы удалить неиспользуемые контейнеры. Если контейнер записывает большое количество данных за пределами /home каталога или приносит собственное хранилище (BYOS), это приведет к сбоям запуска или исключениям среды выполнения после превышения ограничения места на диске узла.

Рекомендуется хранить образы контейнеров как можно меньше и записывать данные в постоянное хранилище или BYOS при работе на Служба приложений Linux. Если это невозможно, необходимо разделить план Служба приложений, так как место на диске узла фиксировано и совместно используется для всех контейнеров в плане Служба приложений.

Мой пользовательский контейнер долго запускается, и платформа перезапускает контейнер до завершения его запуска.

Можно настроить для платформы время ожидания перед перезапуском контейнера. Это можно сделать, указав для параметра приложения WEBSITES_CONTAINER_START_TIME_LIMIT нужное значение. Значение по умолчанию — 230 секунд, а максимальное значение — 1800 секунд.

Какой формат используется для URL-адреса сервера частного реестра?

Нужно указать полный URL-адрес реестра, включая http:// или https://.

Какой формат используется для имени образа в частном реестре?

Добавьте полное имя образа, включая URL-адрес частного реестра (например, myacr.azurecr.io/dotnet:latest). На портале нельзя вводить имена образов, которые используют пользовательский порт. Чтобы задать docker-custom-image-name, воспользуйтесь программой командной строки az.

Можно ли предоставить несколько портов в образе настраиваемого контейнера?

Мы не поддерживаем предоставление больше одного порта.

Можно ли использовать собственное хранилище?

Да, функция использования собственного хранилища находится на этапе предварительной версии.

Почему мне не удается просматривать файловую систему или выполняющиеся процессы моего пользовательского контейнера на сайте SCM?

Сайт SCM выполняется в отдельном контейнере. Поэтому вы не можете проверить файловую систему или выполняющиеся процессы контейнера приложения.

Нужно ли реализовать протокол HTTPS в своем настраиваемом контейнере?

Нет, платформа обрабатывает завершение протокола HTTPS на общих внешних интерфейсах.

Нужно ли использовать WEBSITES_PORT для настраиваемых контейнеров?

Да, этот элемент необходим для настраиваемых контейнеров. Чтобы вручную задать настраиваемый порт, используйте инструкцию EXPOSE в Dockerfile и параметр приложения WEBSITES_PORT, указав значение порта для привязки к контейнеру.

Можно ли использовать ASPNETCORE_URLS в образе Docker?

Да, переопределите переменную среды перед запуском приложения .NET Core. Например, в скрипте init.sh: export ASPNETCORE_URLS={ваше_значение}

Мультиконтейнер с Docker Compose

Как настроить Реестр контейнеров Azure (ACR) для использования с мультиконтейнером?

Для использования ACR с мультиконтейнером все образы контейнеров должны размещаться на одном сервере реестра ACR. Если они находятся на одном сервере реестра, необходимо создать параметры приложения, а затем обновить файл конфигурации Docker Compose, включив в него имя образа ACR.

Создайте следующие параметры приложений:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (полный URL-адрес, например, https://<server-name>.azurecr.io)
  • DOCKER_REGISTRY_SERVER_PASSWORD (включить доступ с правами администратора в параметрах ACR)

В файле конфигурации укажите образ ACR, как в следующем примере:

image: <server-name>.azurecr.io/<image-name>:<tag>

Как узнать, какой контейнер доступен из Интернета?

  • Доступ может быть открыт только к одному контейнеру
  • Доступны только порты 80 и 8080 (предоставляемые порты)

Ниже приведены правила определения доступного контейнера в порядке приоритета.

  • Параметру приложения WEBSITES_WEB_CONTAINER_NAME присвоено имя контейнера
  • Первый контейнер, который определяет порт 80 или 8080
  • Если ни одно из приведенных выше правил не выполняется, доступным (предоставляемым) будет первый контейнер, определенный в файле

Как использовать depends_on?

Параметр depends_on не поддерживается в Службе приложений и будет игнорироваться. Как и в рекомендации Docker по управлению запуском и завершением работы, многоконтейнерные приложения Службы приложений должны проверять зависимости через код приложения — и при запуске, и при отключении. В приведенном ниже примере кода показано, как приложение Python проверяет, запущен ли контейнер Redis.

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

Подключения Web Socket

Веб-сокеты поддерживаются в приложениях Linux. Параметр webSocketsEnabled ARM не применяется к приложениям Linux, так как веб-сокеты всегда включены для Linux.

Внимание

Веб-сокеты теперь поддерживаются для приложений Linux на бесплатных Служба приложений планах. Мы поддерживаем до пяти подключений веб-сокета в планах бесплатного Служба приложений. Превышение этого ограничения приводит к ответу HTTP 429 (слишком много запросов).

Цены и соглашение об уровне обслуживания

Сколько сейчас стоит общедоступная служба?

Цены зависят от SKU и региона, но вы можете просмотреть дополнительные сведения на странице цен: Цены Службы приложений.

Другие вопросы

Как работает запрос прогрева контейнера?

Когда Служба приложений Azure запускает контейнер, запрос прогрева отправляет HTTP-запрос в конечную точку /robots933456.txt вашего приложения. Это просто фиктивная конечная точка, но приложению необходимо ответить с любым кодом состояния, отличным от 5XX. Если логика приложения не предусматривает отправку ответов с каким-либо кодом состояния HTTP в несуществующие конечные точки, запрос прогрева не сможет получить ответ, и контейнер будет постоянно перезапускаться. Запрос прогрева также может завершиться неудачно из-за неправильной конфигурации порта.

О том, как проверить правильность настройки порта в Службе приложений Azure, см. в вопросе Как указать порт в контейнере Linux?

Можно ли увеличить время ожидания запроса прогрева контейнера?

По умолчанию запрос прогрева завершается сбоем, если ответ от контейнера не получен в течение 240 секунд. Вы можете увеличить время ожидания запроса прогрева контейнера, добавив параметр приложения WEBSITES_CONTAINER_START_TIME_LIMIT со значением от 240 до 1800 секунд.

Как указать порт в контейнере Linux?

Тип контейнера Description Как настроить и использовать порт
Встроенные контейнеры Когда вы выбираете версию языка или платформы для приложения Linux, для вас выбирается предопределенный контейнер. Чтобы получить в коде приложения правильный порт, используйте переменную среды PORT.
Пользовательские контейнеры Вы полностью контролируете контейнер. Служба приложений не может контролировать, какой порт прослушивает ваш контейнер. Ей необходимо лишь знать, на какой порт перенаправлять запросы. Если контейнер прослушивает порт 80 или 8080, Служба приложений сможет автоматически обнаружить его. Если он прослушивает любой другой порт, необходимо задать номер порта в параметре приложения WEBSITES_PORT, и Служба приложений будет перенаправлять запросы на этот порт в контейнере. Параметр приложения WEBSITES_PORT не влияет на контейнер, и к нему нельзя получить доступ как к переменной среды в контейнере.

Можно ли использовать файловую базу данных (например, SQLite) с веб-приложением Linux?

Файловая система приложения представляет собой подключенную сетевую папку. Это позволяет использовать сценарии горизонтального увеличения масштаба, в которых код должен выполняться на нескольких узлах. К сожалению, это не позволяет использовать файловые системы управления базами данных, такие как SQLite, поскольку будет невозможно реализовать монопольную блокировку файлов базы. Рекомендуется использовать одну из управляемых служб баз данных: Azure SQL, Базу данных Azure для MySQL или Базу данных Azure для PostgreSQL.

Какие символы поддерживаются в именах параметров приложения?

Для параметров приложения можно использовать только буквы (A–Z, a–z), цифры (0–9) и символ подчеркивания (_).

Где можно отправить запрос на новые возможности?

Вы можете отправить свои идеи на форум отзывов о веб-приложениях. Добавьте [Linux] в заголовок своей идеи.