IIS7.0にて、wfastcgiを使ってPythonのWSGIアプリ(今回はFlask)をホストしようとしたところ、いくつかエラーが出て引っかかったため、メモを残しておきます。
環境
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
IIS7.0ではどうすればよいかを調べてみたところ、KB980363を適用することで、IIS7.0にsignalBeforeTerminateSeconds
が追加されるようでした。
- Important update for IIS 7.0 FastCGI module | RuslanY Blog
- FastCGI Module : The Official Microsoft IIS Forums
そのため、上記リンクより該当のアップデートファイルをダウンロードし、適用・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となるかを調べてみたところ、
- IIS - HTTP Error 503. The service is unavailable - Stack Overflow
- iis 7 - IIS giving 503 errors - Stack Overflow
- The IIS 7 Team Rocks! - You've Been Haacked
などがありました。
名前空間予約の構成については、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のパッチが提供されています。
- FIX、PHP アプリケーションを IIS 7.0 で実行すると、REQUEST_URI サーバー変数に依存している PHP アプリケーションが失敗します。
- FIX: The FastCGI module does not work if you are using the HWC functionality of IIS 7.0 and the process that hosts the HWC is part of a Windows job object
試しにこれらをインストールしてみようとしたところ、
この更新プログラムはお使いのシステムには適用されません。
と表示され、インストール自体ができませんでした。