2009-04-28 11 views
0

をパイソンを使用するように私は、ApacheウェブサーバにPHPを追加することの一つ一般的に知られている方法は、このようにそれを設定することだと思う:Apacheを設定だけでCGI、PHPのような

ScriptAlias /php5.3 /usr/local/php5.3/bin 
Action application/php5.3 /php5.3/php-cgi 
AddType application/php5.3 .php 

今私は、Pythonのために同様の構成を書き込もうとしました:

ScriptAlias /python /usr/bin 
Action application/python /python/python 
AddType application/python .py 

私はこのようになり、小さなテストスクリプトがあります。

print "Content-Type: text/html\n\n" 
print "Test" 

しかし、何かに見えるが

Premature end of script headers: python 

だから私の最初は、しかし、私のpythonの応答が正しくないということでした:Apacheのエラーログには、次のと言うので、sが間違っています。しかし、Content-Typeと両方の改行があります。また、php-cgiと呼ばれる同様のPHPスクリプトの出力は、まったく同じ出力を与えます。

また、このようにPythonを動作させる方法を示すチュートリアルは見つかりませんでした。だから、それは不可能かもしれないが、私はなぜこれが当てはまるのだろうか?または私は何かを逃していますか?

+0

明確にする:私は選択肢を知っていて、正しくpythonを設定する方法を知っています。なぜこの設定がうまくいかないのか不思議です... – okoman

答えて

5

「これは可能ではないかもしれませんが、私はなぜこれが当てはまるのでしょうか?

正しい。不可能です。どちらも意図されていませんでした。

理由1 - PythonはPHPではありません。 PHPは全体として、CGIになることを期待しています。 Pythonはそうではありません。

理由2 - Pythonは本質的にCGIではありません。それは(ほとんど)環境的な期待を持っている通訳です。

理由3 - Pythonは決してCGIとして設計されていませんでした。そのため、Pythonは通常、小さなラッパー(mod_python、mod_wsgi、mod_fastcgi)に埋め込まれており、実行中のPythonプログラムにとってより意味のある形式でCGI環境をカプセル化できます。

+0

さて、私はCGIの詳細な記事を読んで、その点を見ていると思います。 – okoman

+0

各リクエストでインタプリタの起動時のオーバーヘッドを考慮すれば、Pythonはcgiで完全に正常に動作します。確かに、私はそれと一緒に現代のウェブサイトを実行しないだろうが、それは動作します。 – JimB

+0

PythonはCGIで動作しますが、PHPと同じ設定ではありません。 –

13

実行形式のいずれもcgiとして実行できます。あなたの問題は、あなたが作成したように見えるあなたのapache設定にあります。詳細についてはApacheのドキュメントをチェックしてください。ただし、ActionとAddTypeは必要ありません。それは実行可能だことを確認してください

#!/usr/bin/python 
# test.py 
print "Content-Type: text/html\n\n" 
print "Test" 

、および「未熟/cgi-bin/test.py

+0

ニースと簡潔な答え。 –

+0

そうですが、私は '普通の' CGIスクリプトを望んでいませんでしたが、インタプリタの行は避けてください。 – okoman

+1

しかし、PHPのCGIは '普通の' CGIです。あなたはあなたのスクリプトを実行するために、apacheからPHPインタプリタを呼び出すことになります。 – JimB

1

エラーの結果を参照してください。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 

は、その後、あなたのcgi-binのに次のようにドロップしますスクリプトヘッダーの終わり: "は、Unix LFではなく改行のためにCRLF文字を使用するWindowsプログラムで.pyファイルが編集された場合に発生します。

Dreamweaverなどの一部のプログラムでは、環境設定で改行タイプが使用されています。メモ帳でもCRLFが使用されます。

ホストにファイルエディタがある場合は、現在の改行をバックスペースでテストし、CRLFをLFのみに変更するエディタで再入力することでテストできます。メモ帳++はLFのみを使用できます。

0

たとえば、http://localhost/test.pyを開くと、Apacheが何らかの形でプロセス/usr/bin/python /var/www/test.py(i。単一のコマンドライン引数を持つインタプリタ)。しかし、Apacheが引数でcgiスクリプトを呼び出すため、これは起こりません。代わりに、CGIで標準化されている環境変数を通じてすべての情報を提供します。

他の人がpythonをplain cgiとして使用していると指摘していますが、教育上の理由から依然としてこれを試すことができます。

#!/usr/bin/python 
import os 
execfile(os.environ['PATH_TRANSLATED']) 

は作ることを忘れないでください:デフォルトのApacheのcgi-binの設定は、以下の内容でご/usr/lib/cgi-binに簡単なpythonという名前のラッパー(またはものは何でもあなたが選ぶ)を作成することができますアクティブであると仮定すると

それは、実行可能:chmod a+x /usr/lib/cgi-bin/python

あなたにApacheの設定をこれらを入れて:

AddType application/python .py 
Action application/python /cgi-bin/python 

あなたは開くhttp://localhost/test.py Apacheは引数なしでCGI環境変数で満たされた/ cgi-bin/pythonを実行します。この場合、Webルートのファイルを直接指しているので、PATH_TRANSLATEDを使用します。
execfileを呼び出すと、すでに開いているpythonプロセス内でそのスクリプトが解釈されます。

関連する問題