IIS용 Python 웹앱 구성

Windows 컴퓨터( Azure의 Windows 가상 머신 포함)에서 IIS(인터넷 정보 서비스)를 웹 서버로 사용하는 경우, IIS가 Python 코드를 제대로 처리할 수 있도록 Python 웹 애플리케이션을 구성해야 합니다. Python 웹 앱에 대한 web.config 파일의 설정을 통해 구성합니다. 이 문서에서는 필요한 설정을 구성하는 방법을 설명합니다.

필수 조건

  • Windows에 Python이 설치되었습니다. 웹앱을 실행하려면 먼저 Python 인터프리터 설치에 설명된 대로 Windows 호스트 머신에 바로, 필요한 버전의 Python을 설치합니다.

    • python.exe 인터프리터 위치를 확인합니다. 편의상, 해당 위치를 PATH 환경 변수에 추가할 수 있습니다.
  • 필요한 패키지가 설치되었습니다. 전용 호스트를 사용하는 경우 가상 환경 대신 글로벌 Python 환경을 사용하여 앱을 실행할 수 있습니다. 따라서, pip install -r requirements.txt 명령을 실행하여 모든 앱의 요구 사항을 전역 환경에 설치할 수 있습니다.

Python 인터프리터를 가리키도록 web.config 설정

Python 애플리케이션의 web.config 파일은 Windows에서 실행되는 IIS 웹 서버(버전 7 이상)에 HttpPlatformHandler(권장) 또는 FastCGI를 통해 Python 요청을 처리하는 방법을 지시합니다. Visual Studio 버전 2015 및 이전 버전에서는 이러한 수정 작업을 자동으로 확인합니다. Visual Studio 2017 및 이후 버전을 사용하는 경우, web.config 파일을 수동으로 수정해야 합니다.

프로젝트에 아직 web.config 파일이 포함되어 있지 않은 경우, 프로젝트 디렉터리를 마우스 오른쪽 단추로 클릭하고 추가 > 새 항목을 선택한 후 web.config를 검색하거나 빈 web.config XML 파일을 만들어 파일을 추가할 수 있습니다.

HttpPlatformHandler 구성

HttpPlatform 모듈은 소켓 연결을 독립 실행형 Python 프로세스에 직접 전달합니다. 이 전달을 통해 원하는 모든 웹 서버를 실행할 수 있지만, 로컬 웹 서버를 실행하는 시작 스크립트가 필요합니다. 이 방법은 일반적으로 Flask 또는 Django와 같은 Python 웹 프레임워크를 사용하여 수행됩니다. web.config 파일의 <httpPlatform> 요소에 스크립트를 지정합니다. 이 processPath 속성은 사이트 확장의 Python 인터프리터를 가리킵니다. 이 arguments 속성은 로컬 웹 서버를 실행하는 시작 스크립트(이 경우 runserver.py)와 제공하려는 모든 인수를 가리킵니다.

<?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의 연결을 수신 대기해야 하는 포트가 포함됩니다. 이 예제에서는 원하는 경우 다른 환경 변수(이 경우 SERVER_PORT)를 만드는 방법도 보여 줍니다. 필요에 따라 환경 변수를 만들고 할당할 수 있습니다.

FastCGI 처리기 구성

FastCGI는 요청 수준에서 작동하는 인터페이스입니다. IIS는 들어오는 연결을 받은 다음 하나 이상의 영구적 Python 프로세스에서 실행되는 WSGI 앱에 각 요청을 전달합니다.

참고 항목

WFastCGI 프로젝트가 더 이상 유지 관리되지 않으므로 HttpPlatformHandler를 사용하여 앱을 구성하는 것이 좋습니다.

FastCGI를 사용하려면 먼저 pypi.org/project/wfastcgi/에 설명된 대로 wfastcgi 패키지를 설치하고 구성합니다.

그런 다음, 애플리케이션의 web.config 파일을 수정하여 python.exe 실행 파일 및 wfastcgi.py 파일로 이어지는 전체 경로를 PythonHandler 키에 포함합니다. 다음 단계에서는 Python이 c:\python36-32 폴더에 설치되고 앱 코드가 c:\home\site\wwwroot 폴더에 있다고 가정합니다. 경로에 맞게 이러한 값을 조정합니다.

  1. 경로를 Python 설치 위치와 일치하도록 PythonHandler 파일에서 web.config 항목을 수정합니다. 자세한 내용은 IIS 구성 파일 참조 (iis.net)를 참조하세요.

    <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. <appSettings> 파일의 web.config 섹션 내에 WSGI_HANDLER, WSGI_LOG(옵션) 및 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> 값은 앱에서 환경 변수로 사용할 수 있습니다.

    • PYTHONPATH 키의 값은 자유롭게 확장될 수 있지만, 해당 앱의 루트를 포함해야 합니다.
    • WSGI_HANDLER 키는 앱에서 가져올 수 있는 WSGI 앱을 가리켜야 합니다.
    • WSGI_LOG 키는 선택 사항이지만 앱 디버깅 용으로 권장됩니다.
  3. web.config 파일의 WSGI_HANDLER 항목을 사용 중인 프레임워크에 적합하게 설정합니다.

    • Bottle: 이 예제에서 보여주듯이 app.wsgi_app 값 뒤에 괄호를 추가합니다. 객체가 변수가 아니라 함수이기 때문에 괄호가 필요합니다. app.py 파일에서 구문을 확인할 수 있습니다.

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask: <project_name>이 프로젝트의 이름과 일치하는 <project_name>.app으로 WSGI_HANDLER 값을 변경합니다. from <project_name> import app 파일에서 runserver.py 문을 찾아 정확한 식별자를 확인할 수 있습니다. 예를 들어, 프로젝트의 이름을 FlaskAzurePublishExample라고 한다면, 항목은 다음과 같이 표시됩니다.

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django: Django 프로젝트에 대해 web.config 파일에서 두 가지 사항을 변경해야 합니다.

      • WSGI_HANDLER 값을 django.core.wsgi.get_wsgi_application()으로 변경합니다. 개체가 wsgi.py 파일에 있습니다.

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • WSGI_HANDLER 키에 대한 항목 직후에 다음 항목을 추가합니다.. 값을 DjangoAzurePublishExample 프로젝트 이름으로 바꿉니다.

        <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 주소로 대체합니다.

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

    배열 결과에 URL을 추가하지 않으면 다음 오류가 표시됩니다.

    DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
    

배열이 비어 있으면 Django는 자동으로 'localhost''127.0.0.1' 를 호스트로 허용합니다. 프로덕션 URL을 추가하는 경우 이러한 호스트 사이트는 자동으로 허용되지 않습니다. 이러한 이유로 settings.py 파일의 개발 및 프로덕션 복사본을 별도로 유지 관리하거나, 환경 변수를 사용하여 런타임 값을 제어하는 것이 좋습니다.

IIS 또는 Windows 가상 머신에 배포

프로젝트에 올바른 web.config 파일이 있는 경우 솔루션 탐색기에서 IIS를 실행하는 컴퓨터에 게시할 수 있습니다. 프로젝트를 마우스 우클릭하고, 게시를 선택한 다음, IIS, FTP 등을 선택합니다. 이 경우 Visual Studio는 프로젝트 파일만 서버에 복사합니다. 모든 서버 쪽 구성을 담당합니다.