Поделиться через


Служба приложений 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, с помощью которого вы хотите инициализировать приложение

Эти команды или скрипты выполняются после запуска встроенного контейнера 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 Container Registry или DockerHub, следуйте Непрерывное развертывание с веб-приложением для контейнеров. Для частных реестров контейнер можно обновить, остановив и снова запустив свое веб-приложение. Либо измените или добавьте фиктивный параметр приложения, чтобы принудительно обновить контейнер.

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

Да.

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

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

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

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

  • Используйте функцию непрерывной поставки (предварительная версия). Чтобы использовать непрерывную поставку Azure, исходный код приложения можно хранить в репозитории Git для Azure DevOps или в репозитории GitHub. Для получения дополнительной информации см. Как настроить непрерывную доставку для веб-приложения на Linux.

  • Используйте 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
  • 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)

Веб-сокеты

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

Внимание

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

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

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

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

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

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

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

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

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

Чтобы убедиться, что порт настроен правильно в службах приложений Azure, см. вопрос о том, как указать порт в контейнере Linux?

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

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

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

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

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

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

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

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

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

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

Следующие шаги

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.