DjangoサイトをIIS上で動かす Windows 10 + Python 3.8.6

今回はDjangoで作成したアプリケーションをIISにホストする方法について書いていきます。

環境
Python 3.8.6
Windows 10 Home
IIS 10.0

Pythonのインストール

まず、Pythonをインストールします。
ここのインストール方法が間違っていると、IIS上で動きません。
具体的にはFastCGI プロセスが予期せずに終了しましたというエラーが出ます。
わたし自身、環境にもともとPythonをインストールしていたので、なかなかこのエラーに気づきませんでした。
上記エラーで困っている方は、この点を見直すと良いと思います。



Add Python 3.8 to PATHをチェックしてCustomize installationをクリックします。



次の画面はNextを押して進みます。



つぎの画面でInstall for all usersにチェックをいれます。
デフォルトProgram Files配下に保存されると思いますが、ここも確認しておきましょう。
Installを押して完了です。

PythonのPathを通す

次にPythonの環境変数を設定していきます。



Windowsキーを押しあとに環境という風にタイプすると環境変数の編集画面に簡単にいけます。

変数からPathをクリックして、以下のようにPython38とScriptsのパスを追加しておきます。


IISの有効化

次にIISの有効化設定をしていきます。
windowsキーを押してwindowと打つと、編集画面に早くいけます。



インターネットインフォメーションサービスにチェックを入れます。



次にWorld Wide webサービス→アプリケーション開発機能と展開していき、CGIにチェックを入れます。


Djangoプロジェクトの開始

次にプロジェクトを開始していきます。
C:\inetpub\wwwroot配下にDjangoというディレクトリを作成し、その中にプロジェクトフォルダを作成していくようにします。
プロジェクトフォルダ名はmysiteとしました。

cd ..
cd ..
cd inetpub
cd wwwroot
mkdir django
cd django
mkdir mysite
cd mysite


作成したらmysite配下にrequirements.txtを加えます。

# requirements.txt
Django~=3.1.2
wfastcgi~=3.0.0


次に仮想環境を作成します。

python -m venv myvenv
myvenv\scripts\activate


ここからのコマンドは全て仮想環境下で行っていきます。
まずはpip installしましょう。

(myvenv) C:\inetpub\wwwroot\django\mysite>pip install -r reqruirements.txt
>>>
...
    Running setup.py install for wfastcgi ... done
Successfully installed Django-3.1.13 asgiref-3.4.1 pytz-2021.3 sqlparse-0.4.2 wfastcgi-3.0.0


次にdjangoプロジェクトをスタートします。
最後の.を忘れないようにしてください

(myvenv) C:\inetpub\wwwroot\django\mysite>django-admin startproject project .


ここまででこのようなフォルダ構成になっているはずです。



とりあえずロケットを飛ばしてみます。

(myvenv) C:\inetpub\wwwroot\django\mysite>python manage.py runserver


http://127.0.0.1:8000/


IISにホストする

そしてIISにホストしていきます。
まずIISマネージャーを起動させましょう。
ここもwindowsキー+IISとタイプするとIISマネージャーの起動画面に簡単にアクセスできます。



次にWebsiteを追加します。
マネージャー起動後に左サイドバーのサイトをクリックしますと…



右サイドバーからWebサイトを追加できます。



以下のように入力していきます。
ポート80はデフォルトで使われているので、違うものを入力しましょう。
今回は8080としました。



次にFast CGIをハンドラーに設定するためにロック解除コマンドを叩きます。
ここで以下のように認証エラーが出ることがあります。

(myvenv) C:\inetpub\wwwroot\django\mysite>%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
>>>
ERROR ( message:Configuration error
Filename: redirection.config
Line Number: 0
Description: Cannot read configuration file due to insufficient permissions
. )


要はredirecttion.configにアクセスする権限がないということです。
そういう場合は下記のフォルダにアクセスしてください。
C:\Windows\System32\inetsrv



一番上のconfigフォルダをダブルクリックしますと…



このようなポップアップが出るので、続行をクリックします。
これを行うことで、コマンドからもアクセスできるようになります。
再びコマンドを打ちましょう。

(myvenv) C:\inetpub\wwwroot\django\mysite>%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
>>>
Unlocked section "system.webServer/handlers" at configuration path "MACHINE/WEBROOT/APPHOST".


無事にロックの解除ができました。
次にwfastcgi-enableコマンドを叩きます。

(myvenv) C:\inetpub\wwwroot\django\mysite>wfastcgi-enable
>>>
Applied configuration changes to section "system.webServer/fastCgi" for "MACHINE/WEBROOT/APPHOST" at configuration commit path "MACHINE/WEBROOT/APPHOST"
"c:\inetpub\wwwroot\django\mysite\myvenv\scripts\python.exe|c:\inetpub\wwwroot\django\mysite\myvenv\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor


次にプロジェクト直下(mysite直下)にweb.configを作成します。

<configuration>
  <appSettings>
    <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
    <add key="PYTHONPATH" value="C:\inetpub\wwwroot\django\mysite" />
    <add key="DJANGO_SETTINGS_MODULE" value="project.settings" />
  </appSettings>
  <system.webServer>
    <handlers>
        <add name="Python FastCGI"
        path="*"
        verb="*"
        modules="FastCgiModule"
        scriptProcessor="c:\inetpub\wwwroot\django\mysite\myvenv\scripts\python.exe|c:\inetpub\wwwroot\django\mysite\myvenv\lib\site-packages\wfastcgi.py"
        resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>


scriptProcessorの中はwfastcgi-enableで出力された文字をそのままあてます。

ここまで来たらホストできているはずです。
http://localhost:8080/にアクセスしてみましょう。
Djangoのロケットが飛んでいたら成功です。

うまくいかない場合

プロジェクトフォルダにiis_iusrsの権限が与えられているか確認してみてください。
wwwrootフォルダを右クリック→プロパティ→セキュリティタブ→編集ボタンと進む。
wwwrootのアクセス許可画面より追加ボタンをクリック、ユーザーまたはグループの選択画面へ。
「選択するオブジェクト名を入力してください」のボックスにiis_iusrsと入力してOK。
権限は以下のようにしておけばいいと思います。


FastCGI プロセスが予期せずに終了しました、というエラーが出る場合。

このエラーが出る場合はPythonのインストール方法が間違っている可能性が高いです。
冒頭に書いたようにインストールからやり直してみると良いと思います。

複数サイトをホストしたい

要件によっては複数サイトを動かしたいという場合があると思います。
その場合は、サイトを追加して、ポートは別の番号をあてておきます。
その後、wfastcgi-enableコマンドを叩いて、同じようにweb.configを作成すれば、複数サイトが配信されます。

TOPページ