IIS7.0 + Python3 + wfastcgi 構成のWSGIアプリ作成時に発生したエラーのメモ

IIS7.0にて、wfastcgiを使ってPythonWSGIアプリ(今回はFlask)をホストしようとしたところ、いくつかエラーが出て引っかかったため、メモを残しておきます。

 

環境

  • IIS 7.0
  • Python 3.5.1
  • wfastcgi 2.2
  • Flask 0.10.1
    • ポート4567で稼働

 

wfastcgi-enableでsignalBeforeTerminateSecondsエラー

今回はFlask公式のHello Worldアプリを使います。
Welcome | Flask (A Python Microframework)

>virtualenv -p c:\python35-32\python.exe env
>env\Scripts\activate
(env) >pip install flask
(env) >pip install wfastcgi

# アプリを作成後、ローカルで起動確認
(env) >python hello.py

 
ローカルでの起動を確認できたため、wfastcgiを使ってIISでホストしてみます。
wfastcgi 2.2 : Python Package Index

 
手順に従い、wfastcgi-enableを実行したところ、エラーになりました。

(env) > wfastcgi-enable
ERROR ( message:属性 "signalBeforeTerminateSeconds" が不明です。 )
An error occurred running the command:

['C:\\Windows\\system32\\inetsrv\\appcmd.exe', 'set', 'config', '/section:system.webServer/fastCGI', "/+[fullPath='path\\to\\app\\env\\scripts\\python.exe', arguments='path\\to\\app\\env\\lib\\site-packages\\wfastcgi.py', signalBeforeTerminateSeconds='30']"]

Ensure your user has sufficient privileges and try again.

 
signalBeforeTerminateSecondsについて調べたところ、IIS7.5より導入された機能のようでした。
FastCGI : The Official Microsoft IIS Site

 
IIS7.0ではどうすればよいかを調べてみたところ、KB980363を適用することで、IIS7.0にsignalBeforeTerminateSecondsが追加されるようでした。

 
そのため、上記リンクより該当のアップデートファイルをダウンロードし、適用・OSの再起動を行いました。

再度実行してみたところ、

(env) >wfastcgi-enable
構成変更を構成コミット パス "MACHINE/WEBROOT/APPHOST" の "MACHINE/WEBROOT/APPHOST" のセクション "system.webServer/fastCgi" に適用しました
"path\to\app\env\scripts\python.exe|path\to\app\env\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor

問題なく実行できました。

 

Flaskアプリにアクセスすると503エラー

IISの設定を行い、サイトのWebサイトの参照からFlaskアプリにアクセスしたところ、

Service Unavailable
HTTP Error 503. The service is unavailable.

とブラウザに表示されました。

イベントログやログファイル(%WinDir%\System32\LogFilesの下)も調べてみましたが、特に何も出力されていませんでした。

 
どんな時に503となるかを調べてみたところ、

などがありました。

 
名前空間予約の構成については、Nancyアプリを作る際に思い当たるフシがあったため、手元の状況を確認してみます。

(env) d:\webapp\serial_trace_flask>netsh http show urlacl

URL 予約:
-----------------

    予約済み URL            : http://+:4567/
        ユーザー: <user>
            リッスン: Yes
            委任: No
            SDDL: D:(A;;GX;;;<id>)

ポート4567に対するエントリが存在していました。

 
今回は不要なエントリだったため、

(env) >netsh http delete urlacl url=http://+:4567/

URL 予約を正常に削除しました

と、エントリを削除してみたところ、503は表示されなくなりました。

 

Flaskアプリにアクセスすると500エラー

再度Flaskアプリにアクセスしたところ、

HTTP エラー 500.0 - Internal Server Error

<handler> scriptProcessor が <fastCGI> アプリケーション構成で見つかりませんでした

とブラウザに表示されました。

 
scriptProcessorの設定を確認するため、IISマネージャにて、サイト > サイト名 > ハンドラマッピング > Python FastCGI > 編集をクリックします。

実行可能ファイル欄を見たところ、

path\to\app\env\scripts\python.exe|path\to\app\ env\lib\site-packages\wfastcgi.py

と、envの前に不用意な空白がありました。おそらく、コマンドプロンプトからコピペした時に残ったものだと考えられました。

そこで、空白を取ってみたところ、500エラーは表示されず、Flaskアプリの画面が表示されました。

 

IISマネージャにFastCGIのアイコンがない

IISマネージャを見たところ、通常はサーバー直下に存在するFastCGIの設定アイコンがありませんでした。

どこにいったのだろうと考え調べてみたところ、Administration Pack for IISを追加でインストールする必要があるとのことでした。
Using FastCGI to Host PHP Applications on IIS 7 : The Official Microsoft IIS Site

上記のリンクから、Administration Pack for IISをダウンロード・インストールしたところ、FastCGIの設定アイコンが表示されました。

 

その他

PHPまわりでは、KB954946やKB967131のパッチが提供されています。

 
試しにこれらをインストールしてみようとしたところ、

この更新プログラムはお使いのシステムには適用されません。

と表示され、インストール自体ができませんでした。