IIS용 Python 웹앱 구성Configure Python web apps for IIS

Windows 컴퓨터(Azure의 Windows 가상 머신 포함)에서 IIS(인터넷 정보 서비스)를 웹 서버로 사용하는 경우 IIS에서 Python 코드를 적절하게 처리할 수 있도록 Python 앱의 web.config 파일에 특정 설정이 포함되어야 합니다.When using Internet Information Services (IIS) as a web server on a Windows computer (including Windows virtual machines on Azure, Python apps must include specific settings in their web.config files so that IIS can properly process Python code. 컴퓨터 자체에도 웹앱에 필요한 패키지와 함께 Python이 설치되어 있어야 합니다.The computer itself must also have Python installed along with any packages the web app requires.

Note

이전에는 이 문서에 Windows의 Azure App Service에서 Python을 구성하는 방법에 대한 지침이 포함되어 있었습니다.This article previously contained guidance for configuring Python on Azure App Service on Windows. 해당 시나리오에서 사용된 Python 확장 및 Windows 호스트는 사용이 중단되었으며 Linux의 Azure App Service로 대체되었습니다.The Python extensions and Windows hosts used in that scenario have been deprecated in favor of Azure App Service on Linux. 자세한 내용은 Azure App Service(Linux)에 Python 앱 게시를 참조하세요.For more information, see Publishing Python Apps to Azure App Service (Linux). 그러나 Python 확장을 사용하여 Windows의 App Service 관리에서 이전 문서를 계속 사용할 수 있습니다.The previous article, however, is still available on Managing App Service on Windows with the Python extensions.

Windows에 Python 설치Install Python on Windows

웹앱을 실행하려면 먼저 Python 인터프리터 설치에 설명된 대로 Windows 호스트 머신에 바로, 필요한 버전의 Python을 설치합니다.To run a web app, first install your required version of Python directly on the Windows host machine as described on Install Python interpreters.

이후 단계를 위해 python.exe 인터프리터의 위치를 기록합니다.Record the location of the python.exe interpreter for later steps. 편의상, 해당 위치를 PATH 환경 변수에 추가할 수 있습니다.For convenience, you can add that location to your PATH environment variable.

패키지 설치Install packages

전용 호스트를 사용하는 경우 가상 환경 대신 글로벌 Python 환경을 사용하여 앱을 실행할 수 있습니다.When using a dedicated host, you can use the global Python environment to run your app rather than a virtual environment. 따라서 명령 프롬프트에서 pip install -r requirements.txt를 실행하여 모든 앱의 요구 사항을 전역 환경에 설치할 수 있습니다.Accordingly, you can install all of your app's requirements into the global environment simply by running pip install -r requirements.txt at a command prompt.

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

앱의 web.config 파일은 Windows에서 실행 중인 IIS(7 이상) 웹 서버에 HttpPlatform(권장) 또는 FastCGI를 통해 Python 요청을 처리하는 방법을 지시합니다.Your app's web.config file instructs the IIS (7+) web server running on Windows about how it should handle Python requests through either HttpPlatform (recommended) or FastCGI. Visual Studio 버전 2015 및 이전 버전에서는 이러한 수정 작업을 자동으로 확인합니다.Visual Studio versions 2015 and earlier make these modifications automatically. Visual Studio 2017 이상을 사용하는 경우 web.config를 수동으로 수정해야 합니다.When using Visual Studio 2017 and later, you must modify web.config manually.

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="c:\python36-32\python.exe"
                  arguments="c:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="c:\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.

사용하려면 먼저 pypi.org/project/wfastcgi/에 설명된 대로 wfastcgi 패키지를 설치하고 구성합니다.To use it, first install and configure the wfastcgi package as described on pypi.org/project/wfastcgi/.

그런 다음, 앱의 web.config 파일을 수정하여 python.exewfastcgi.py의 전체 경로를 PythonHandler 키에 포함합니다.Next, modify your app's web.config file to include the full paths to python.exe and wfastcgi.py in the PythonHandler key. 아래 단계에서는 Python이 c:\python36-32에 설치되어 있고 앱 코드가 c:\home\site\wwwroot에 있다고 가정합니다. 사용자 경로에 맞게 적절하게 조정합니다.The steps below assume that Python is installed in c:\python36-32 and that your app code is in c:\home\site\wwwroot; adjust for your paths accordingly:

  1. 경로가 Python 설치 위치와 일치하도록 web.configPythonHandler 항목을 수정합니다. 정확한 정보는 IIS 구성 참조(iis.net)를 참조하세요.Modify the PythonHandler entry in web.config so that the path matches the Python install location (see IIS Configuration Reference (iis.net) for exact details).

    <system.webServer>
      <handlers>
        <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
            scriptProcessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py"
            resourceType="Unspecified" requireAccess="Script"/>
      </handlers>
    </system.webServer>
    
  2. web.config<appSettings> 섹션 내에서 WSGI_HANDLER, WSGI_LOG(옵션) 및 PYTHONPATH에 대한 키를 추가합니다.Within the <appSettings> section of web.config, add keys for WSGI_HANDLER, WSGI_LOG (optional), and PYTHONPATH:

    <appSettings>
      <add key="PYTHONPATH" value="c:\home\site\wwwroot"/>
      <!-- The handler here is specific to Bottle; see the next section. -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      <add key="WSGI_LOG" value="c:\home\LogFiles\wfastcgi.log"/>
    </appSettings>
    

    이러한 <appSettings> 값은 앱에서 환경 변수로 사용할 수 있습니다.These <appSettings> values 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.
  3. web.configWSGI_HANDLER 항목을 사용 중인 프레임워크에 적합하게 설정합니다.Set the WSGI_HANDLER entry in web.config as appropriate for the framework you're using:

    • Bottle: 아래 표시된 대로 app.wsgi_app 뒤에 괄호가 있는지 확인합니다.Bottle: make sure that you have parentheses after app.wsgi_app as shown below. 이는 해당 개체가 변수가 아닌 함수이기 때문에 필요합니다(app.py 참조).This is necessary because that object is a function (see app.py) rather than a variable:

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask: WSGI_HANDLER 값을 <project_name>.app으로 변경합니다. 여기서 <project_name>은 프로젝트 이름과 일치합니다.Flask: Change the WSGI_HANDLER value to <project_name>.app where <project_name> matches the name of your project. runserver.pyfrom <project_name> import app 문을 살펴보면 정확한 식별자를 찾을 수 있습니다.You can find the exact identifier by looking at the from <project_name> import app statement in the runserver.py. 예를 들어 프로젝트 이름이 “FlaskAzurePublishExample”인 경우 항목은 다음과 같이 표시됩니다.For example, if the project is named "FlaskAzurePublishExample", the entry would appear as follows:

      <!-- Flask apps only: change the project name to match your app -->
      <add key="WSGI_HANDLER" value="flask_iis_example.app"/>
      
    • Django: Django 프로젝트에 대한 web.config에서 두 가지 사항을 변경해야 합니다.Django: Two changes are needed to web.config for Django projects. 먼저, WSGI_HANDLER 값을 django.core.wsgi.get_wsgi_application()으로 변경합니다(개체가 wsgi.py 파일에 있음).First, change the WSGI_HANDLER value to django.core.wsgi.get_wsgi_application() (the object is in the wsgi.py file):

      <!-- Django apps only -->
      <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
      

      둘째, DjangoAzurePublishExample을 사용자의 프로젝트 이름으로 대체하여 WSGI_HANDLER에 대한 아래 항목을 추가합니다.Second, add the following entry below the one for WSGI_HANDLER, replacing DjangoAzurePublishExample with the name of your project:

      <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
      
  4. Django 앱만 해당: Django 프로젝트의 settings.py 파일에서 아래와 같이 사이트 URL 도메인 또는 IP 주소를 ALLOWED_HOSTS에 추가합니다. ‘1.2.3.4’는 사용자 URL 또는 IP 주소로 바꿉니다.Django apps only: In the Django project's settings.py file, add your site URL domain or IP address to ALLOWED_HOSTS as shown below, replacing '1.2.3.4' with your URL or IP address, of course:

    # Change the URL or IP address to your specific site
    ALLOWED_HOSTS = ['1.2.3.4']
    

    배열에 사용자 URL을 추가하지 않으면 DisallowedHost/잘못된 HTTP_HOST 헤더: ‘<site URL>’. ‘<site URL>’을 ALLOWED_HOSTS에 추가해야 할 수도 있습니다. 오류가 발생합니다.Failure to add your URL to the array results in the error DisallowedHost at / Invalid HTTP_HOST header: '<site URL>'. You may need to add '<site URL>' to ALLOWED_HOSTS.

    배열이 비어 있으면 Django는 ‘localhost’ 및 ‘127.0.0.1’을 자동으로 허용하지만 프로덕션 URL을 추가하면 해당 기능이 제거됩니다.Note that when the array is empty, Django automatically allows 'localhost' and '127.0.0.1', but adding your production URL removes those capabilities. 이러한 이유로 settings.py의 개발 및 프로덕션 복사본을 별도로 유지 관리하거나, 환경 변수를 사용하여 런타임 값을 제어하는 것이 좋습니다.For this reason you might want to maintain separate development and production copies of settings.py, or use environment variables to control the run time values.

IIS 또는 Windows VM에 배포Deploy to IIS or a Windows VM

프로젝트에 올바른 web.config 파일이 있으면 솔루션 탐색기에서 프로젝트 상황에 맞는 메뉴의 게시 명령을 사용하고 IIS, FTP 등 옵션을 선택하여 IIS를 실행하는 컴퓨터에 게시할 수 있습니다.With the correct web.config file in your project, you can publish to the computer running IIS by using the Publish command on the project's context menu in Solution Explorer, and selecting the option, IIS, FTP, etc.. 이 경우 Visual Studio는 단순히 프로젝트 파일을 서버에 복사하기만 하며, 모든 서버 쪽 구성은 사용자의 책임입니다.In this case, Visual Studio simply copies the project files to the server; you're responsible for all server-side configuration.