Azure App Service에서 Python 앱에 대한 사용자 지정 시작 파일 구성

이 문서에서는 Azure App Service에서 호스트되는 Python 웹앱에 대한 사용자 지정 시작 파일을 구성하는 시기와 방법을 알아봅니다. 로컬 개발에는 시작 파일이 필요하지 않지만 Azure App Service Docker 컨테이너 내에서 배포된 웹앱을 실행합니다. 이 웹앱을 제공하는 경우 시작 명령을 사용할 수 있습니다.

다음과 같은 상황에서 사용자 지정 시작 파일이 필요합니다.

  • 사용자 지정 Gunicorn 인수: 기본값을 초과하는 추가 인수를 사용하여 Gunicorn 기본 웹 서버를 시작하려고 합니다.--bind=0.0.0.0 --timeout 600

  • 대체 프레임워크 또는 서버: 앱은 Flask 또는 Django 이외의 프레임워크를 사용하여 빌드되거나 Gunicorn 대신 다른 웹 서버를 사용하려고 합니다.

  • 비표준 Flask 애플리케이션 구조: 기본 코드 파일의 이름이 app.py 또는 application.py이외의 이름으로 지정되거나 앱 개체의 이름이 다른appFlask 앱이 있습니다.

즉, 프로젝트에 Flask 앱 개체가 있는 루트 폴더에 app.py 또는 app 파일이 없는 한 사용자 지정 시작 명령이 필요합니다.

자세한 내용은 Python 앱 구성 - 컨테이너 시작 프로세스를 참조하세요.

사전 요구 사항

사용자 지정 시작 파일을 구성하기 전에 Python 실행하는 기존 App Service on Linux 필요합니다. App Service를 만들려면 App Service용 Python 빠른 시작 가이드를 따르세요. Azure CLI 사용하여 App Service를 만들 수도 있습니다.

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 아이콘을 선택하고, 리소스를 확장하고, 구독을 찾아서 확장하고, App Services를 확장하고, App Service를 마우스 오른쪽 단추로 클릭하고, 포털에서 열기를 선택합니다.

  4. Azure Portal의 왼쪽에 있는 서비스 메뉴에서 설정>구성을 선택합니다. App Service의 구성 페이지에서 일반 설정을 선택하고 스택 설정시작 명령에서 시작 파일의 이름(> 또는 startup.sh)을 입력한 다음 저장을 선택합니다.

    또는 Azure CLI 사용하여 시작 명령을 설정할 수 있습니다.

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

    비고

    시작 명령 파일을 사용하는 대신 시작 명령 자체를 Azure Portal의 시작 명령 필드에 직접 배치할 수 있습니다. 구성을 리포지토리에 저장하기 때문에 시작 명령 파일을 사용하는 것이 좋습니다. 이렇게 하면 버전 제어가 변경 내용을 추적하고 다른 Azure App Service 인스턴스로의 재배포를 간소화할 수 있습니다.

  5. App Service를 다시 시작하라는 메시지가 표시되면 계속 을 선택합니다.

    애플리케이션 코드를 배포하기 전에 Azure App Service 사이트에 액세스하는 경우 요청을 처리하는 데 사용할 수 있는 코드가 없기 때문에 "애플리케이션 오류"가 나타납니다.

Django 시작 명령

기본적으로 Azure App Service는 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

시간 제한 값을 1,200초(초)--timeout 1200로 늘리는 등 Gunicorn 인수를 수정하려면 사용자 지정 시작 명령 파일을 만듭니다. 이 메서드는 특정 요구 사항을 사용하여 기본 설정을 재정의합니다. 자세한 내용은 컨테이너 시작 프로세스 - Django 앱을 참조하세요.

Flask 시작 명령

기본적으로 App Service on 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 시작 파일은 __init__.py 파일이 있는 모듈인 hello_app 폴더 내에 포함됩니다. 앱 개체의 이름이 지정 app 되고 __init__.py 정의됩니다. webapp.py 상대 가져오기를 사용합니다.

    이러한 구성으로 인해 webapp:app을(를) Gunicorn에 지정하면 "비패키지에서 상대 가져오기 시도"라는 오류가 발생하고 앱이 시작되지 않습니다.

    이 경우 모듈에서 앱 개체를 가져오는 shim 파일을 만든 다음, Gunicorn이 shim을 사용하여 앱을 시작하게 합니다. 예를 들어 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 앱을 실행하는 App Service 컨테이너에는 기본적으로 Django 및 Flask가 Gunicorn 웹 서버와 함께 설치되어 있습니다.

Django 또는 Flask 이외의 프레임워크(예: Falcon, FastAPI 등)를 사용하거나 다른 웹 서버를 사용하려면 다음을 수행합니다.

  • requirements.txt 파일에 프레임워크 및 웹 서버를 포함합니다.

  • 시작 명령에서 Flask에 대한 이전 섹션에 설명된 대로 호출 가능한 WSGI를 식별합니다.

  • Gunicorn 이외의 웹 서버를 시작하려면 서버를 직접 호출하는 대신 명령을 사용합니다 python -m . 예를 들어 다음 명령은 WSGI 호출 가능 이름이 지정 되고 app 있다고 가정하여 uvicorn 서버를 시작합니다.

    python -m uvicorn application:app --host 0.0.0.0
    

    python -m을 통해 설치된 웹 서버는 Python 전역 환경에 추가되지 않으므로 사용하므로 직접 호출할 수 없습니다. 이 python -m 명령은 현재 가상 환경 내에서 서버를 호출합니다.

앱 배포

시작 파일을 구성한 후 App Service에 애플리케이션 코드를 배포해야 합니다. 선택한 Azure CLI 또는 배포 방법을 사용합니다.

az webapp up --name <app-name>

더 많은 배포 옵션은 배포 모범 사례를 참조하세요.