Настройка пользовательского файла запуска для приложений Python в Службе приложений Azure

В этой статье вы узнаете, когда и как настроить пользовательский файл запуска для веб-приложения Python, размещенного в службе приложений Azure. Хотя файл запуска не требуется для локальной разработки, Служба приложений Azure запускает развернутое веб-приложение в контейнере Docker, который может использовать команды запуска при их предоставлении.

Вам нужен пользовательский файл запуска в следующих ситуациях:

  • Пользовательские аргументы Gunicorn: вы хотите запустить веб-сервер gunicorn по умолчанию с дополнительными аргументами за пределами его значений по умолчанию.--bind=0.0.0.0 --timeout 600

  • Альтернативные платформы или серверы: приложение создается с помощью платформы, отличной от Flask или Django, или вы хотите использовать другой веб-сервер вместо Gunicorn.

  • Структура приложений Flask, не стандартная. У вас есть приложение Flask, основной файл кода которого называется что-то другое, кроме app.py или application.py, или объект приложения называется нечто другоеapp.

Другими словами, требуется пользовательская команда запуска, если проект не имеет app.py или application.py файл в корневой папке с именем appобъекта приложения Flask.

Дополнительные сведения см. в разделе "Настройка приложений Python — процесс запуска контейнера".

Необходимые условия

Прежде чем настраивать пользовательский файл запуска, необходимо, чтобы у вас уже была существующая служба App Service в Linux с Python. Чтобы создать App Service, следуйте инструкциям из краткого руководства по Python для App Service. Вы также можете создать службу приложений с помощью Azure CLI:

az webapp create --resource-group <group> --plan <plan> --name <app-name> --runtime "PYTHON:3.12"

Создание файла запуска

Если вам нужен пользовательский файл запуска, выполните следующие действия.

  1. Создайте файл в проекте с именем startup.txt, startup.sh или другое имя, содержащее команды запуска. Дополнительные сведения о Django, Flask и других платформах см. в следующих разделах этой статьи.

    При необходимости файл запуска может включать несколько команд.

  2. Закоммитьте файл в репозиторий кода, чтобы его можно было развернуть вместе с остальной частью приложения.

  3. В Visual Studio Code выберите значок Azure на панели действий, разверните ресурсы, найдите и разверните подписку, разверните службу приложений и щелкните правой кнопкой мыши службу приложений и выберите "Открыть на портале".

  4. На портале Azure в меню службы слева выберите "Конфигурация параметров>". На странице "Конфигурация" службы приложений выберите общие параметры, введите имя файла запуска (например, startup.txt или startup.sh) в разделе "Командазапуска> стека", а затем нажмите кнопку "Сохранить".

    Кроме того, можно использовать Azure CLI для задания команды запуска:

    az webapp config set --resource-group <group> --name <app-name> --startup-file "<startup-command>"
    

    Замечание

    Вместо использования файла команды запуска можно поместить команду запуска непосредственно в поле "Команда запуска " на портале Azure. Рекомендуется использовать файл команды запуска, так как он хранит конфигурацию в репозитории. Это позволяет управлять версиями для отслеживания изменений и упрощения повторного развертывания в других экземплярах Службы приложений Azure.

  5. Нажмите кнопку "Продолжить", когда появится запрос на перезапуск службы приложений.

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

Команды запуска Django

По умолчанию Служба приложений Azure находит папку, содержащую файл wsgi.py, и запускает Gunicorn с помощью следующей команды:

# <module> is the folder that contains wsgi.py. If you need to use a subfolder,
# specify the parent of <module> using --chdir.
gunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi

Если вы хотите изменить любые аргументы Gunicorn, например увеличение значения времени ожидания до 1200 секунд (--timeout 1200), создайте пользовательский файл команды запуска. Этот метод переопределяет параметры по умолчанию с конкретными требованиями. Дополнительные сведения см. в разделе "Процесс запуска контейнера" — приложение Django.

Команды запуска Flask

По умолчанию Служба приложений в Linux предполагает, что приложение Flask соответствует следующим критериям:

  • Вызываемый объект WSGI называется app.
  • Код приложения содержится в файле с именем application.py или app.py.
  • Файл приложения находится в корневой папке приложения.

Если проект отличается от этой структуры, пользовательская команда запуска должна определить расположение объекта приложения в файле форматирования :app_object:

  • Другое имя файла и (или) имя объекта приложения: если основной файл кода приложения hello.py , а объект приложения называется myapp, команда запуска выглядит следующим образом:

    gunicorn --bind=0.0.0.0 --timeout 600 hello:myapp
    
  • Файл запуска находится в вложенной папке: если файл запуска является myapp/website.py , а объект приложения — appиспользуйте аргумент Gunicorn --chdir , чтобы указать папку, а затем присвойте файлу запуска и объекту приложения как обычно:

    gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:app
    
  • Файл запуска находится в модуле: в коде python-sample-vscode-flask-tutorial файл запуска webapp.py содержится в папке hello_app, которая является модулем с файлом __init__.py. Объект приложения называется app и определяется в __init__.py. webapp.py использует относительный импорт.

    Из-за этого указание Gunicorn на webapp:app вызывает ошибку "Попытка относительного импорта в непакете", и приложение не запускается.

    В этой ситуации создайте файл схима, который импортирует объект приложения из модуля, а затем запустите приложение с помощью схима. Например, код python-sample-vscode-flask-tutorial содержит startup.py со следующим содержимым:

    from hello_app.webapp import app
    

    Затем выполняется следующая команда запуска:

    gunicorn --bind=0.0.0.0 --workers=4 startup:app
    

Дополнительные сведения см. в разделе "Процесс запуска контейнера" — приложение Flask.

Другие платформы и веб-серверы

Контейнер службы приложений, на котором выполняются приложения Python, по умолчанию установлен Django и Flask вместе с веб-сервером Gunicorn.

Чтобы использовать платформу, отличную от Django или Flask (например, Falcon, FastAPI и других), или использовать другой веб-сервер:

  • Включите платформу и веб-сервер в файл requirements.txt .

  • В команде запуска определите вызываемый WSGI, как описано в предыдущем разделе для Flask.

  • Чтобы запустить веб-сервер, отличный от Gunicorn, используйте python -m команду вместо вызова сервера напрямую. Например, следующая команда запускает сервер uvicorn , предполагая, что вызываемый объект WSGI называется app и находится в application.py:

    python -m uvicorn application:app --host 0.0.0.0
    

    Вы используете python -m, так как веб-серверы, установленные через requirements.txt не добавляются в глобальную среду Python и поэтому не могут вызываться напрямую. Команда python -m вызывает сервер из текущей виртуальной среды.

Развертывание приложения

После настройки файла запуска вам нужно развернуть код приложения в App Service. Используйте выбранный Azure CLI или метод развертывания:

az webapp up --name <app-name>

Дополнительные варианты развертывания см. в рекомендациях по развертыванию.