Azure App Service에서 Python 환경을 설정하는 방법(Windows)How to set up a Python environment on Azure App Service (Windows)

중요

Microsoft는 Linux의 App Service에 직접 배포하기 위해 이 문서에 설명된 Windows의 App Service에 대한 Python 확장의 사용을 중단했습니다.Microsoft has deprecated the Python extensions for App Service on Windows as described in this article in favor of a direct deployment to App Service on Linux.

Azure App Service는 브라우저를 통해 액세스한 사이트, 고유한 클라이언트에서 사용된 REST API, 이벤트 트리거된 처리 등 웹앱용 Platform-as-a-Service 제품입니다.Azure App Service is a platform-as-a-service offering for web apps, whether they are sites accessed through a browser, REST APIs used by your own clients, or event-triggered processing. App Service는 Python을 사용한 앱 구현을 완벽하게 지원합니다.App Service fully supports using Python to implement apps.

사용자 지정이 가능한 Azure App Service의 Python 지원은 각각 특정 버전의 Python 런타임이 포함된 App Service 사이트 확장 집합으로 제공됩니다.Customizable Python support for Azure App Service is provided as a set of App Service site extensions that each contain a specific version of the Python runtime. 이 문서에 설명된 대로 원하는 모든 패키지를 해당 환경에 직접 설치할 수 있습니다.You can then install any desired packages directly into that environment, as described in this article. App Service 자체에서 환경을 사용자 지정하면 웹 앱 프로젝트에서 패키지를 유지 관리하거나 앱 코드로 업로드할 필요가 없습니다.By customizing the environment in the App Service itself, you don't need to maintain packages in your web app projects or upload them with the app code.

기본적으로 App Service는 서버의 루트 폴더에 Python 2.7 및 Python 3.4가 설치되어 있지만, 이러한 환경에서 패키지를 사용자 지정하거나 설치할 수도 없고, 현재 상태에 의존할 수도 없습니다.Although App Service by default has Python 2.7 and Python 3.4 installed in root folders on the server, you cannot customize or install packages in these environments, nor should you depend on their presence. 대신 이 문서에 설명된 대로 직접 제어하는 사이트 확장을 사용해야 합니다.You should instead rely on a site extension that you control, as described in this article.

Azure Portal을 통해 Python 버전 선택Choose a Python version through the Azure portal

  1. Azure Portal에서 웹앱에 대한 App Service를 만듭니다.Create an App Service for your web app on the Azure portal.

  2. App Service의 페이지에서 개발 도구 섹션으로 스크롤하고, 확장 을 선택한 다음, + 추가 를 선택합니다.On the App Service's page, scroll to the Development Tools section, select Extensions, then select + Add.

  3. 목록에서 원하는 Python의 버전을 포함하는 확장까지 아래로 스크롤합니다.Scroll down in the list to the extension that contains the version of Python you want:

    Python 확장이 표시된 Azure Portal

    Python의 이전 버전이 필요한데 사이트 확장에 표시되지 않을 경우, 다음 섹션에 설명된 대로 Azure Resource Manager를 통해 설치할 수 있습니다.If you need an older version of Python and don't see it listed in the site extensions, you can still install it through the Azure Resource Manager as described in the next section.

  4. 확장을 선택하고, 법률 조항에 동의한 다음, 확인 을 선택합니다.Select the extension, accept the legal terms, then select OK.

  5. 설치가 완료되면 포털에서 알림이 나타납니다.A notification appears in the portal when installation is complete.

Azure Resource Manager를 통해 Python 버전 선택Choose a Python version through the Azure Resource Manager

Azure Resource Manager 템플릿을 사용하여 App Service를 배포하는 경우 사이트 확장을 리소스로 추가합니다.If you are deploying an App Service with an Azure Resource Manager template, add the site extension as a resource. 특히 확장은 siteextensions 형식과 siteextensions.net의 이름을 사용하여 중첩된 리소스(resources 아래의 resources 개체)로 표시됩니다.Specifically, the extension appears as a nested resource (a resources object under resources) with the type siteextensions and the name from siteextensions.net.

예를 들어 python361x64(Python 3.6.1 x64)에 참조를 추가한 후 템플릿이 다음과 같이 표시될 수 있습니다(일부 속성 생략됨).For example, after adding a reference to python361x64 (Python 3.6.1 x64), your template may look like the following (some properties omitted):

"resources": [
  {
    "apiVersion": "2015-08-01",
    "name": "[parameters('siteName')]",
    "type": "Microsoft.Web/sites",

    // ...

    "resources": [
      {
        "apiVersion": "2015-08-01",
        "name": "python361x64",
        "type": "siteextensions",
        "properties": { },
        "dependsOn": [
          "[resourceId('Microsoft.Web/sites', parameters('siteName'))]"
        ]
      },
      // ...
    ]
  }

Python 인터프리터를 가리키도록 web.config 설정Set web.config to point to the Python interpreter

포털이나 Azure Resource Manager 템플릿을 통해 사이트 확장을 설치한 후, Python 인터프리터를 가리키도록 앱의 web.config 파일을 설정합니다.After installing the site extension (through either the portal or an Azure Resource Manager template), you next point your app's web.config file to the Python interpreter. web.config 파일은 App Service에서 실행 중인 IIS(7 이상) 웹 서버에 HttpPlatform(권장) 또는 FastCGI를 통해 Python 요청을 처리해야 하는 방법을 지시합니다.The web.config file instructs the IIS (7+) web server running on App Service about how it should handle Python requests through either HttpPlatform (recommended) or FastCGI.

먼저 사이트 확장의 python.exe 에 대한 전체 경로를 찾은 다음, 적절한 web.config 파일을 만들고 수정합니다.Begin by finding the full path to the site extension's python.exe, then create and modify the appropriate web.config file.

python.exe에 대한 경로 찾기Find the path to python.exe

Python 사이트 확장은 서버의 d:\home 아래에서 Python 버전 및 아키텍처에 적합한 폴더에 설치됩니다(일부 이전 버전의 경우 제외).A Python site extension is installed on the server under d:\home in a folder appropriate to the Python version and architecture (except in the case of a few older versions). 예를 들어 Python 3.6.1 x64는 d:\home\python361x64 에 설치됩니다.For example, Python 3.6.1 x64 is installed in d:\home\python361x64. Python 인터프리터의 전체 경로는 d:\home\python361x64\python.exe 입니다.The full path to the Python interpreter is then d:\home\python361x64\python.exe.

App Service에서 특정 경로를 보려면 App Service 페이지에서 확장 을 선택한 다음, 목록에서 확장을 선택합니다.To see the specific path on your App Service, select Extensions on the App Service page, then select the extension in the list.

Azure App Service의 확장 목록

그러면 경로를 포함하는 확장의 설명 페이지가 열립니다.This action opens the extension's description page containing the path:

Azure App Service의 확장 세부 정보

확장에 대한 경로를 보는 데 문제가 있는 경우 콘솔을 사용하여 수동으로 찾을 수 있습니다.If you have trouble seeing the path for the extension, you can find it manually using the console:

  1. App Service 페이지에서 개발 도구 > 콘솔 을 선택합니다.On your App Service page, select the Development Tools > Console.
  2. ls ../home 또는 dir ..\home 명령을 입력하여 Python361x64 와 같은 최상위 확장 폴더를 확인합니다.Enter the command ls ../home or dir ..\home to see the top-level extensions folders, such as Python361x64.
  3. ls ../home/python361x64 또는 dir ..\home\python361x64와 같은 명령을 입력하여 python.exe 및 기타 인터프리터 파일이 포함되어 있는지 확인합니다.Enter a command like ls ../home/python361x64 or dir ..\home\python361x64 to verify that it contains python.exe and other interpreter files.

HttpPlatform 처리기 구성Configure the HttpPlatform handler

HttpPlatform 모듈은 소켓 연결을 독립 실행형 Python 프로세스에 직접 전달합니다.The HttpPlatform module passes socket connections directly to a standalone Python process. 이 전달을 통해 원하는 모든 웹 서버를 실행할 수 있지만 로컬 웹 서버를 실행하는 시작 스크립트가 필요합니다.This pass-through allows you to run any web server you like, but requires a startup script that runs a local web server. web.config<httpPlatform> 요소에 스크립트를 지정합니다. 여기서 processPath 특성은 사이트 확장의 Python 인터프리터를 가리키고, arguments 특성은 스크립트 및 제공하려는 모든 인수를 가리킵니다.You specify the script in the <httpPlatform> element of web.config, where the processPath attribute points to the site extension's Python interpreter and the arguments attribute points to your script and any arguments you want to provide:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="D:\home\Python361x64\python.exe"
                  arguments="D:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="D:\home\LogFiles\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

여기에 표시된 HTTP_PLATFORM_PORT 환경 변수에는 로컬 서버가 localhost의 연결을 수신 대기해야 하는 포트가 포함됩니다.The HTTP_PLATFORM_PORT environment variable shown here contains the port that your local server should listen on for connections from localhost. 이 예제에서는 원하는 경우 다른 환경 변수(이 경우 SERVER_PORT)를 만드는 방법도 보여 줍니다.This example also shows how to create another environment variable, if desired, in this case SERVER_PORT.

FastCGI 처리기 구성Configure the FastCGI handler

FastCGI는 요청 수준에서 작동하는 인터페이스입니다.FastCGI is an interface that works at the request level. IIS는 들어오는 연결을 받은 다음 하나 이상의 영구적 Python 프로세스에서 실행되는 WSGI 앱에 각 요청을 전달합니다.IIS receives incoming connections and forwards each request to a WSGI app running in one or more persistent Python processes. wfastcgi 패키지는 사전 설치되고 각 Python 사이트 확장으로 구성되어 있으므로, Bottle 프레임워크를 기반으로 하는 웹앱에 대해 다음과 같은 코드를 web.config 에 포함하여 쉽게 사용할 수 있습니다.The wfastcgi package is pre-installed and configured with each Python site extension, so you can easily enable it by including the code in web.config like what's shown below for a web app based on the Bottle framework. python.exewfastcgi.py 에 대한 전체 경로는 PythonHandler 키에 있습니다.Note that the full paths to python.exe and wfastcgi.py are placed in the PythonHandler key:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
    <!-- The handler here is specific to Bottle; other frameworks vary. -->
    <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
    <add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
  </appSettings>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
           scriptProcessor="D:\home\Python361x64\python.exe|D:\home\Python361x64\wfastcgi.py"
           resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
  </system.webServer>
</configuration>

여기서 정의된 <appSettings>는 앱에서 환경 변수로 사용할 수 있습니다.The <appSettings> defined here are available to your app as environment variables:

  • PYTHONPATH의 값은 자유롭게 확장될 수 있지만 해당 앱의 루트를 포함해야 합니다.The value for PYTHONPATH may be freely extended but must include the root of your app.
  • WSGI_HANDLER는 해당 앱에서 가져올 수 있는 WSGI 앱을 가리켜야 합니다.WSGI_HANDLER must point to a WSGI app importable from your app.
  • WSGI_LOG는 선택 사항이지만 앱 디버깅을 위해 권장됩니다.WSGI_LOG is optional but recommended for debugging your app.

Azure에 게시를 참조하여 Bottle, Flask 및 Django 웹앱을 위한 web.config 콘텐츠에 대한 추가 정보를 확인하세요.See Publish to Azure for additional details on web.config contents for Bottle, Flask, and Django web apps.

패키지 설치Install packages

사이트 확장을 통해 설치된 Python 인터프리터는 사용자의 Python 환경 중 한 부분일 뿐입니다.The Python interpreter installed through a site extension is only one piece of your Python environment. 해당 환경에서도 서로 다른 패키지를 설치해야 하는 경우가 많습니다.You likely need to install different packages in that environment as well.

서버 환경에서 직접 패키지를 설치하려면 다음 방법 중 하나를 사용합니다.To install packages directly in the server environment, use one of the following methods:

메서드Methods 사용Usage
Azure App Service Kudu 콘솔Azure App Service Kudu console 대화형으로 패키지를 설치합니다.Installs packages interactively. 패키지는 순수한 Python이거나 휠을 게시해야 합니다.Packages must be pure Python or must publish wheels.
Kudu REST APIKudu REST API 패키지 설치를 자동화하는 데 사용할 수 있습니다.Can be used to automate package installation. 패키지는 순수한 Python이거나 휠을 게시해야 합니다.Packages must be pure Python or must publish wheels.
앱을 사용한 번들Bundle with app 패키지를 프로젝트에 직접 설치한 다음, 앱의 일부인 경우처럼 App Service에 배포합니다.Install packages directly into your project and then deploy them to App Service as if they were part of your app. 보유한 종속성 수와 업데이트 빈도에 따라 이 방법은 배포 작업을 진행하는 가장 쉬운 방법일 수 있습니다.Depending on how many dependencies you have and how frequently you update them, this method may be the easiest way to get a working deployment going. 주의 사항은 이러한 라이브러리가 서버의 Python 버전과 정확하게 일치해야 한다는 것입니다. 일치하지 않으면 배포 후에 모호한 오류가 표시됩니다.Be advised that libraries must match the version of Python on the server, otherwise you see obscure errors after deployment. 그러나 App Service 사이트 확장의 Python 버전은 python.org에 릴리스된 버전과 정확히 동일하기 때문에 로컬 개발에 사용할 호환되는 버전을 쉽게 얻을 수 있습니다.That said, because the versions of Python in the App Service site extensions are exactly the same as those versions released on python.org, you can easily obtain a compatible version for local development.
가상 환경Virtual environments 지원되지 않습니다.Not supported. 대신, 번들을 사용하고 PYTHONPATH 환경 변수를 패키지의 위치를 가리키도록 설정합니다.Instead, use bundling and set the PYTHONPATH environment variable to point to the location of the packages.

Azure App Service Kudu 콘솔Azure App Service Kudu console

Kudu 콘솔은 App Service 서버와 해당 파일 시스템에 대한 직접적인 관리자 권한 명령줄 액세스를 제공합니다.The Kudu console gives you direct, elevated command-line access to the App Service server and its file system. 이는 모두 유용한 디버깅 도구이며 패키지를 설치하는 등의 CLI 작업을 허용합니다.This is both a valuable debugging tool and allows for CLI operations such as installing packages.

  1. 개발 도구 > 고급 도구 를 선택하고 이동 을 선택하여 Azure Portal의 App Service 페이지에서 Kudu를 엽니다.Open Kudu from your App Service page on the Azure portal by selecting Development Tools > Advanced Tools, then selecting Go. 이 작업을 통해 .scm이 삽입된 것 외에는 기본 App Service URL과 동일한 URL로 이동합니다.This action navigates to a URL that's the same as your base App Service URL except with .scm inserted. 예를 들어 기본 URL이 https://vspython-test.azurewebsites.net/이면 Kudu는 https://vspython-test.scm.azurewebsites.net/에 있습니다(책갈피 사용 가능).For example, if your base URL is https://vspython-test.azurewebsites.net/ then Kudu is on https://vspython-test.scm.azurewebsites.net/ (which you can bookmark):

    Azure App Service용 Kudu 콘솔

  2. 디버그 콘솔 > CMD 를 선택하여 콘솔을 엽니다. 여기서 Python 설치로 이동하여 어떤 라이브러리가 있는지 확인할 수 있습니다.Select Debug console > CMD to open the console, in which you can navigate into your Python installation and see what libraries are already there.

  3. 단일 패키지를 설치하려면To install a single package:

    a.a. 패키지를 설치하려는 Python 설치 폴더(예: d:\home\python361x64)로 이동합니다.Navigate to the folder of the Python installation where you want to install the package, such as d:\home\python361x64.

    b.b. python.exe -m pip install <package_name>을 사용하여 패키지를 설치합니다.Use python.exe -m pip install <package_name> to install a package.

    Azure App Service용 Kudu 콘솔을 통한 bottle 설치의 예

  4. 앱용 requirements.txt 를 서버에 이미 배포한 경우 다음과 같이 해당 요구 사항을 모두 설치합니다.If you've deployed a requirements.txt for your app to the server already, install all those requirements as follows:

    a.a. 패키지를 설치하려는 Python 설치 폴더(예: d:\home\python361x64)로 이동합니다.Navigate to the folder of the Python installation where you want to install the package, such as d:\home\python361x64.

    b.b. python.exe -m pip install --upgrade -r d:\home\site\wwwroot\requirements.txt 명령을 실행합니다.Run the command python.exe -m pip install --upgrade -r d:\home\site\wwwroot\requirements.txt.

    로컬 및 서버 모두에서 정확한 패키지 집합을 쉽게 재현할 수 있기 때문에 requirements.txt 를 사용하는 것이 좋습니다.Using requirements.txt is recommended because it's easy to reproduce your exact package set both locally and on the server. requirements.txt 에 대한 변경 내용을 배포한 후 콘솔을 방문하여 명령을 다시 실행해야 합니다.Just remember to visit the console after deploying any changes to requirements.txt and run the command again.

참고

App Service에는 C 컴파일러가 없으므로 기본 확장 모듈이 있는 모든 패키지에 대해 휠을 설치해야 합니다.There's no C compiler on App Service, so you need to install the wheel for any packages with native extension modules. 인기 있는 많은 패키지가 자체 휠을 제공합니다.Many popular packages provide their own wheels. 자체 휠을 제공하지 않는 패키지의 경우 로컬 개발 컴퓨터의 pip wheel <package_name>을 사용한 다음 휠을 사이트에 업로드합니다.For packages that don't, use pip wheel <package_name> on your local development computer and then upload the wheel to your site. 예제를 보려면 requirements.txt를 사용하여 필수 패키지 관리를 참조하세요.For an example, see Manage required packages with requirements.txt.

Kudu REST APIKudu REST API

Azure Portal을 통해 Kudu 콘솔을 사용하는 대신 https://yoursite.scm.azurewebsites.net/api/command에 명령을 게시하여 Kudu REST API를 통해 원격으로 명령을 실행할 수 있습니다.Instead of using the Kudu console through the Azure portal, you can run commands remotely through the Kudu REST API by posting the command to https://yoursite.scm.azurewebsites.net/api/command. 예를 들어 bottle 패키지를 설치하려면 다음 JSON을 /api/command에 게시합니다.For example, to install the bottle package, post the following JSON to /api/command:

{
    "command": 'python.exe -m pip install bottle',
    "dir": '\home\python361x64'
}

명령 및 인증에 대한 자세한 내용은 Kudu 설명서를 참조하세요.For information about commands and authentication, see the Kudu documentation.

az webapp deployment list-publishing-profiles 명령을 사용하여 Azure CLI를 통해 자격 증명을 볼 수 있습니다(az webapp 배포 참조).You can also see credentials using the az webapp deployment list-publishing-profiles command through the Azure CLI (see az webapp deployment). Kudu 명령을 게시하는 도우미 라이브러리도 GitHub에서 사용할 수 있습니다.A helper library for posting Kudu commands is available on GitHub.