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

Сводка

В этой статье приведены ответы на часто задаваемые вопросы о службе приложений в Linux.

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

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

Stack Ожидаемое значение
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 необязательный настраиваемый запуск
Питон необязательный скрипт запуска
Руби Скрипт Ruby, который инициализирует приложение

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

Управление

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

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

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

Да, через сайт управления источниками в Azure (SCM).

Примечание Вы также можете подключиться к контейнеру приложения с локального компьютера с помощью SSH, протокола SFTP или VS Code.

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

Установите поле reserved службы приложений в true.

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

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

Да, поддерживается CI/CD. Дополнительные сведения см. в разделе "Непрерывное развертывание с помощью веб-приложения для контейнеров".

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

Да.

Можно ли использовать WebDeploy/MSDeploy?

Задайте параметр WEBSITE_WEBDEPLOY_USE_SCM на false.

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

Options:

  • Используйте непрерывную доставку Azure с помощью Azure DevOps или GitHub.
  • Используйте zipdeploy API:
curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy

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

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

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

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

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

Да.

Вы поддерживаете управление зависимостями с помощью Composer для приложений на PHP?

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

Настраиваемые контейнеры

Можно ли использовать управляемые удостоверения при извлечении образов из реестра контейнеров Azure (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-адрес реестра, включая 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={Your value}

Многоконтейнерная архитектура с использованием 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, многоконтейнерные приложения App Service должны проверять зависимости с помощью кода приложения, как при запуске, так и при отключении.

В следующем примере кода показана проверка приложения 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)

Поддерживаются ли веб-сокеты?

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

Это важно

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

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

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

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

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

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

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

Чтобы изменить поведение по умолчанию, можно настроить путь к конечной точке для прогрева и коды состояния, которые указывают на то, что сайт прогрет. Для этого задайте параметры WEBSITE_WARMUP_PATH и WEBSITE_WARMUP_STATUSES приложения.

Запрос на прогревание также может завершиться ошибкой из-за неправильной настройки порта.

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

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

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

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

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

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

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

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

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

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

Ссылки