IIS 用に Python Web アプリを構築する

インターネット インフォメーション サービス (IIS) を Windows コンピューター (Azure 上の Windows 仮想マシンを含む) 上の Web サーバーとして使用するときは、IIS が Python のコードを正しく処理できるように Python Web アプリケーションを設定する必要があります。 構成は、Python Web アプリの web.config ファイルの設定を介して行われます。 この記事では、必要な設定を構成する方法について説明します。

前提条件

  • Python on Windows がインストールされている。 Web アプリを実行する場合、「Python インタープリターのインストール」の説明に従って、Python の必要なバージョンを直接 Windows ホスト マシンにインストールします。

    • python.exe インタープリターの場所を特定します。 便宜上、その場所は PATH 環境変数に追加できます。
  • 必要なパッケージがインストールされている。 専用ホストの場合は、アプリの実行場所として、仮想環境ではなく、グローバルな Python 環境を使用できます。 そのため、pip install -r requirements.txt コマンドを実行することで、アプリの要件をすべてグローバル環境にインストールできます。

Python インタープリターをポイントする web.config の設定

Python アプリケーションの web.config ファイルは、Windows 上で実行される IIS Web サーバー (バージョン 7 以降) に、HttpPlatformHandler (推奨) または FastCGI を通じて Python リクエストを処理する方法を指示します。 Visual Studio 2015 以前のバージョンでは、これらの変更は自動的に行われます。 Visual Studio 2017 以降の場合、web.config ファイルを手動で変更する必要があります。

プロジェクトに web.config ファイルがまだ含まれていない場合は、プロジェクト ディレクトリを右クリックし、[> 新しい項目の追加] を選択して web.config を検索するか、空の web.config XML ファイルを作成して追加できます。

HttpPlatformHandler を構成する

HttpPlatform モジュールは、スタンドアロンの Python プロセスに直接ソケット接続を渡します。 このパススルーにより、任意の Web サーバーを実行することができますが、ローカル Web サーバーを実行するスタートアップ スクリプトが必要になります。 通常、このアプローチは、Flask や Django などの Python Web フレームワークを使用して行われます。 <httpPlatform> ファイルの web.config 要素でスクリプトを指定します。 processPath 属性は、サイト拡張機能の Python インタープリターをポイントします。 arguments 属性は、ローカル Web サーバーを実行するスタートアップ スクリプト (この場合は 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 は、受信接続を受信し、各要求を 1 つ以上の永続的な Python プロセスで実行されている WSGI アプリへ転送します。

Note

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_HANDLERWSGI_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. WSGI_HANDLER ファイルの web.config エントリを、使用しているフレームワークに合わせて適切に設定します。

    • Bottle: この例に示すように、app.wsgi_app 値の後にかっこを追加します。 オブジェクトが変数ではなく関数であるため、かっこが必要です。 構文は、app.py ファイルで確認できます。

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask:WSGI_HANDLER 値を <project_name>.app に変更します。<project_name> はプロジェクトの名前に一致します。 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 ファイルには 2 つの変更が必要です。

      • 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 はプロジェクト ファイルのみをサーバーにコピーします。 すべてのサーバー側の構成はユーザーが行います。