web-dev-qa-db-ja.com

WindowsでFastCgiModuleを使用してPythonおよびFlaskを設定すると、500内部サーバーエラーが発生する

IISでPythonをセットアップできる人はいますか?それを理解しようとしていますが、機能しておらず、私を夢中にさせています。例はたくさんありますが、機能させることができません。


これが私のセットアップです


  • Windows 2008R2
  • IIS 7.5(7.5.7600.16385)
  • wfastcgi.py(2.2.0)
  • フラスコ(0.10.1)
  • Python(3.5.1)

Python + Flask Webアプリのパス

C:\inetpub\wwwroot

これが私が従ったステップです:

  1. CGIウィンドウ機能がインストールされていることを確認しました。
  2. IIS Manager、強調表示されたWebサーバー、およびFastCGI設定で、次の値のアプリケーションを追加しました。

    Full Path: C:\python35\python.exe
    
    Arguments: C:\inetpub\wwwroot\wfastcgi.py
    
    Environment Variable Collection:
    
      PYTHONPATH: C:\inetpub\wwwroot\
      WSGI_HANDLER: app.app
      WSGI_LOG: C:\logs\app.txt
    
  3. C:\ inetpub\wwwrootを指すMyWebSiteというWebサイトを作成しました

  4. Webサイトのハンドラーマッピング設定で、FastCgiModuleのモジュールマッピングを追加しました。

    Request path: *
    Module: FastCgiModule
    Executable: C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py
    Name: FlaskHandler
    

単純なPython app using Flask Webで見つかり、Webルートフォルダーに追加しました。したがって、C:\ inetpub\wwwwには3つのファイルしかありません: app.pyweb.config、およびwfastcgi.py

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appSettings>
        <add key="PYTHONPATH" value="" />
        <add key="WSGI_HANDLER" value="app.app" />
        <add key="WSGI_RESTART_FILE_REGEX" value="(?i).*\.(py|cnf|config)$" />
    </appSettings>
    <system.webServer>
        <handlers>
            <add name="FlaskHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
    </system.webServer>
</configuration>

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from FastCGI via IIS!"

if __name__ == "__main__":
    app.run()

applicationHost.config

グローバルモジュールセクション:

<add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />

モジュールセクション:

<add name="FastCgiModule" lockItem="true" />

システムWebサーバーセクション:

<section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
...
<fastCgi>
    <application fullPath="C:\Python35\python.exe" arguments="C:\inetpub\wwwroot\wfastcgi.py">
        <environmentVariables>
            <environmentVariable name="PYTHONPATH" value="C:\inetpub\wwwroot\" />
            <environmentVariable name="WSGI_HANDLER" value="app.app" />
        <environmentVariable name="WSGI_LOG" value="c:\logs\my_log.txt" />
        </environmentVariables>
    </application>
</fastCgi>

したがって、何らかの理由で期待どおりに機能しません。

これは私が経験していることです:

HTTP Error 500.0 - Internal Server Error

C:\python35\python.exe - The FastCGI process exited unexpectedly

私が試したこと。

ハンドラーのscriptProcessorが正しく呼び出されていないようです。ただし、値を別の値に変更するとエラーが発生するため、呼び出されているようです。

HTTP Error 500.0 - Internal Server Error
<handler> scriptProcessor could not be found in <fastCGI> application configuration

権限の問題だと思ったので、NETWORK SERVICEアカウントにRead&Executeがあることを確認しました。 全員アカウントフルコントロールも与えました。 NETWORK SERVICEは許可が必要なアカウントだと思います。

app.pyのデバッグ情報をログアウトするためにログを追加しました。ログファイルに書き出すことができるログ情報を取得できませんでした。 wfastcgi.pyがIIS構成を使用して、ログファイルの場所を設定したとしても、ログファイルの場所を設定する方法がわかりません。scriptProcessorが実際に呼び出されると、最終的に設定されます。しかし、コードを見ると、システム環境変数を使用しているように見えるので、OS環境変数としてWSGI_LOG値を追加しました。それでもログファイルにデバッグ情報を記録していません。

そこで、コマンドラインで直接引数としてwfastcgiファイルを使用してpython実行可能ファイルを実行しようとしましたが、wfastcgiに入ると期待どおりに機能するようですwhileループリクエストを待っています。また、デバッグ情報をログファイルに記録します。

python.exe c:\inetpub\wwwroot\wfastcgi.py

そして、pythonサーバーを実行すると、ブラウザーでlocalhost:8081に移動すると機能するので、構成上の問題であると思われます。

python app.py runserver 0.0.0.0:8081

だから何が起こっているのか。私は考えが足りません。どんな助けでもいただければ幸いです。

ありがとう!これは私を狂わせています。

8
JQ9

この質問は数か月前のものであることは知っていますが、解決策を共有する必要があると思います。この問題に対処している人を1人も見つけることができなかったので、同じ状況で立ち往生している人を本当に助けることができました。私はこの問題を回避するために1日も費やし、インターネット全体をクロールして説明や実用的な解決策の手がかりを見つけるために、代替サーバーマネージャーに諦めかけました。

私が問題を抱えていた入力は次のようでした:

実行可能(オプション):C:\Python27\python.exe | C:\Python27\Scripts\wfastcgi.py

それは、「実行可能(オプション)」フィールドのパスの周囲の間隔を削除することでした。 2つの入力を運ぶこのようなフィールドは、解析された値をトリミングするのに十分親切であると深く想定していたので、毎回まったく同じ間隔を使用していました。しかし、私は間違っていて、結果として得られた構成は、ギャンブルのダンブルパスとその前に空白があるマッピングでした。私が見るのは非常に不快なすべての空白を削除した後、ハンドラーを削除して元に戻すことなく、期待どおりに機能しました。この種の削除して再試行IISフォーラムでの提案は、すべてが必要であるという誤った信念で開発者の心を汚染しています本当に適切な構成が必要な場合は、元に戻してください。

作業入力:

実行可能(オプション):C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py

これが誰かの助けになることを願っています。MS開発者が万が一ここに来た場合は、この二重入力フィールドの邪悪なハックを削除してください。グローバルレベルでfastCgi設定に移動すると、2つの異なるフィールドに分割され、誤解を招く可能性があります。別の場所の1つのフィールドに2つの入力を要求します。少なくとも両方の値をトリミングして、入力リストのパディングの深い実践者がこの問題に対して二度とクラッシュしないようにしてください!基本的に今入力したものがそこにないというエラーが表示される問題に直面することは非常に不可解です。

更新:

最後に、pythonモジュール内のアプリケーションオブジェクトをIISに公開する必要があり、それ以上のことは何もしません。これは一部の人には明白に思えるかもしれません。 、しかし、それは十分に文書化されておらず、pythonモジュールが実際に彼の側でもアプリを起動するとクラッシュします。開発環境も機能させるには、次のようなものが絶対に必要です。

Python --app.py

# <imports...>
# <routes...>
myApp.secret_key = 'this-is-a-secret-key'

if __name__ == '__main__':
   # start application in python

# IIS will get access to variable `myApp` and start it himself,
# without starting it twice because IIS won't run the script
# as `__main__`. In this scenario `WSGI_HANDLER` will be required
# to have `app.myApp` to reach your application.

IIS内のアプリが機能します。また、python app.pyを使用してデバッグモードでアプリを起動することもできます。

2
Frederik.L

説明によると、IISでいくつかの構成変更が必要なようです。 IIS 7.5で、FastCgiModuleを使用してPython Flaskを実行している場合、以下の構成設定があります。実行できる手順は次のとおりです。

  1. 開くIIS管理r。左側のペインで[サーバー名]をクリックし、中央のペインでダブル[FastCGI設定]をクリックします。右側のペインからActions >> Addをクリックし、2つの設定を行う必要があります。Python 2.7、 Python 3.5のパスを入力する必要がある場合

enter image description here

  1. On IIS "Webサイトを追加"してWebサイトを公開します。以下のスクリーンショットでは、サイト名は「pyprojects」です。およびコンテンツは物理フォルダー「C:\ inetpub\wwwroot\pyprojects」に公開されます

enter image description here

  1. 左側でサイト名を選択し、ハンドラーマッピングをダブルクリックします。右側のペインの[アクション]で、[モジュールマッピングの追加]をクリックして次のように入力します。

    • リクエストパス:handler.fcgi
    • モジュール:FastCgiModule
    • 実行可能ファイル:C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py(Pythonバージョン固有のパス)
    • 名前:Python FastCGI

enter image description here

  1. もう一度左側のサイト名を選択します。次に、[アプリケーション設定]をダブルクリックします。既存の構成の場合、%ROOTDIR%PYTHONPATHおよびWSGI_ALT_VIRTUALENV_ACTIVATE_THISのデプロイメントディレクトリに置き換える必要があります。

enter image description here

  1. あなたのウェブサイトを閲覧する

それがあなたを助け、将来同じ問題に遭遇する人々のために時間を節約することを願っています。

2
gmsi