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 フォルダーにあると想定しています。 パスに合わせて、これらの値を適宜調整してください。
パスが 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>
<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
キーは省略可能ですが、アプリのデバッグのために推奨されます。
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" />
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 はプロジェクト ファイルのみをサーバーにコピーします。 すべてのサーバー側の構成はユーザーが行います。