2016-09-14 6 views
0

Iは、Python/2.7.3セットアップのApache/2.2.22(Debianの)のmod_wsgi/3.3に抱き合わせていmod_wsgiはどのようにアプリケーションを認識して実行していますか?

私はWSGIScriptAlias実行取得する管理者が、唯一のトップレベルのモジュールコードではなく、その中に画定されapplication。 apacheのエラーログに表示されるブラウザを使用してURLを要求すると

#!/usr/bin/python 
import sys 
print >> sys.stderr, "I'm wsgi_test" 

def application(environ, start_response): 
     print >> sys.stderr, 'in application' 
     status = '200 OK' 
     output = 'hello World' 
     response_headers = [('Content-type', 'text/plain'), 
          ('Content-Length', str(len(output)))] 
     start_response(status, response_headers) 
     return [output] 

wsgi_test.pyスクリプトが実行されます( "私はwsgi_testよ":

Apacheの設定:

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so 

WSGIScriptAlias /testurl /home/django/test/test/wsgi_test.py 

<Directory /home/django/test/test> 
<Files wsgi_test.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

がwsgi_test.py )。ただし、ページは提供されず(500内部サーバーエラー)、追加のエラーログエントリがありますスクリプトヘッダーの早すぎる終了:wsgi_test.py。第二の試験として

は、私は正しく 'Hello Worldの' を提供、簡単なスクリプトを、使用:

wsgi_test2.py:

#!/usr/bin/python 
import sys 
print 'Content-type: text/plain\n\n' 
print 'Hello World' 

私の質問: はどのようmod_wsgiのは知っているし、実行しません応用?

上記のテストから、私はwsgi_test.pyが直ちに実行されると結論づけます。実行可能なコードはなく、定義はapplicationなので、スクリプトは何も出力しないので、サーバはHTMLヘッダーの欠落について苦情を言います。 applicationを実行するようにシステムに指示するにはどうすればよいですか?

答えて

3

mod_wsgiモジュールは、あなたが思っているようにスクリプトを実行しません。つまり、プログラムとして実行しません。

Apacheの設定は、.pyという拡張子のファイルがCGIスクリプトとして実行されるように設定されている可能性があります。したがって、実際にはmod_wsgiで処理されていません。これはあなたが見ている行動を説明するでしょう。

.pyファイルCGIスクリプトを作るAddHandlerディレクティブを無効にする、または.wsgi拡張子を持ち、一致するWSGIScriptAliasディレクティブを変更するには、あなたのWSGIスクリプトの名前を変更するのどちらか。

これが完了すると、mod_wsgiはWSGIスクリプトをメモリにロードし、サーバープロセスのメモリにPythonコードを実行します。別のプログラムの実行としてではありません。

現在warnに設定した場合は、ApacheでLogLevelディレクティブがinfoに設定されていることを確認した場合は、それを最初に実行するためにWSGIスクリプトをロードしているときについてのmod_wsgiによって記録された多くのメッセージが表示されるはずです。これは、mod_wsgiがそれらを処理していることを確認します。

+0

ありがとうございました!これは本当に嫌な落とし穴です。特に、デフォルトのdjango wsgiファイルは 'wsgi.py'という名前になっています(私はテストを始めていました)。 'project.wsgi'などの方がよいでしょうか? –

+0

mod_wsgiのドキュメントでは、通常、これ以外の理由で、常に「.wsgi」拡張子を推奨しています。 Djangoは '' .wsgi''ファイルを生成し、 '' wsgi.py''をインポートするべきだと提案されましたが、提案は無視されました。結局のところ、この欠陥はApacheの設定でデフォルトを追加するためのLinuxディストリビューションにあります。これは '' cgi-bin''ディレクトリだけでなく全てのディレクトリに対して '' .py''をCGIに強制します。しかし、この問題は誰にも影響しません。それで、デフォルトのApache設定で何かコメントを外して有効にしてもよろしいですか? –

+0

ウェブホスティングサービス上にあらかじめ設定されたApacheで問題が発生しました。私はデフォルト設定を変更しませんでした。しかし、それはウェブホスティング業者がそうしたことかもしれません。 –