web-dev-qa-db-ja.com

Apache2でPythonスクリプトを実行する

PythonプログラムをApacheを使用して実行しようとしています。ただし、Apacheはファイルを提供するだけで、実際には実行しません。ファイルの権限はr/w/xで、/var/wwwにあります。後でhttpd.confの内容とプログラムコードを投稿します。また、pythonスクリプトを.cgiファイルとして実行しようとしましたが、うまくいきませんでした。mod_pythonmod_wsgiの両方があります。 Apacheにもロードされたモジュール。

Pythonサンプル:

#!/usr/bin/python

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

httpd.conf:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py

私はその小さなhttpd.confファイルを知っていますが、Apacheをインストールしたとき、ファイルには何もありませんでした。また、これは、Apacheでのpythonの実行の基本を学ぶためのものです。本番環境での使用を目的としたものではありません。ご協力ありがとうございます。

編集する

私が使用しているOSはUbuntu 10.04で、Apacheのバージョンは2です。pythonバージョン2.6があり、#!/usr/bin/env pythonが呼び出されたときに自動的に使用されます。
2つの主なエラーが発生しています。1つ目は、ファイルとフォルダの権限が777であるにもかかわらず、ファイルが見つからないことです。ログのエラーは

[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1

このエラーは、私が記述していない別のpythonスクリプトに関するものです。奇妙なのは、ブラウザウィンドウからアクセスしたときにファイルがフォルダのインデックスに表示されることです。しかし、ファイルに、上記のエラーが発生します。

もう1つのエラーは、ヘッダーの途中で終了することです。エラーは以下のとおりです。

[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py
12
tpar44

Httpd.confの最初の行:AddHandler cgi-script .cgi .plは、Perlスクリプトではなくpythonスクリプトをテストしているため、無関係です。そして、これらのディレクティブをpythonスクリプトの場所内で定義し、その場所でcgiスクリプトを実行する必要があることをApacheに伝えます:Options +ExecCGI。このスニペットが出発点です:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>

補遺1

私の最後のコメントに従って、このスクリプトを試してください。 cgi環境に関する情報を吐き出すはずです。

#!/usr/bin/python
import cgi
cgi.test()

補遺2

上記の構成でスクリプトを機能させました。問題は、スクリプトがpython2で記述されていることです。そして、Apacheがスクリプトを実行するために呼び出すデフォルトのインタープリターはpython3です(少なくとも私の場合、そしてこれはあなたにとっても同じであろう)。

これは、hello worldスクリプトのpython3バージョンです。

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

補遺

最初のエラーについては、デプロイしようとしているディレクトリとファイルの権限と所有権が適切に設定されていることを確認してください。そして、それらのディレクティブをhttpd.confに追加してみてください。

Order allow,deny
Allow from all

これはあなたにこれをもたらします:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>

2番目のエラーについては、何か欠落していない限り、Apacheがpython 3インタープリターを起動してスクリプトを実行しているようです。この可能性を排除するには、次のことを試してください。

ls -al /usr/bin/python*

これにより、システムで使用可能なpythonインタープリターがリストされます。複数のインタープリターがある場合は、次のような出力が得られます。

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  

そうでない場合は、次の出力になります。

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  

確認するには、これはあなたが抱えている問題ではありません。次の変更されたサンプルスクリプトを試してください。

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

Apacheが呼び出すべきインタプリタのバージョンを明示的に述べたことに気づくでしょう。これは醜いものです。しかし、テストのために、それを行うことができます。もちろん、マップする必要があります#!/usr/bin/python2.6、サーバー上にある任意のバイナリに、python 3互換コードとpython 2インタプリタ、およびその逆を混在させないでください。

18
ylabidi

Re:Exec形式エラー。

私自身、これまでに2、3回実行したことがあります。まったく同じ(暗号)エラーメッセージが表示されました。

私はWindowsマシンのNotepad ++でCGIを介して使用するPython(3)スクリプトを開発し、それをLinuxサーバーにアップロードしていました。

不満が多かった後、この問題は行末に関連していますであることがわかりましたWindowsの行末(\ r\n)をUNIXの行末(\ n)に変換

Notepad ++(6.1.5)では、Editメニューに移動してEOL変換を選択することでこれを実現できますオプションを選択して、ファイルを保存します。

3
nibbler

** Apache2バージョン2.4の場合

Sudo apt-get install python
Sudo apt-get install Apache2

ファイル/etc/Apache2/conf-enables/serve-cgi-bin.confを編集します

====古いセクションをコメントし、以下のコードを追加してください:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AddHandler cgi-script .py
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

=========================================

ファイル/etc/Apache2/Apache2.confを編集***以下のコードを追加:

<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

<Directory /usr/local/Apache2/cgi-bin>
Require all granted
</Directory>

注意!

use for Apache2.4 
  file python keep in directory: /var/www/cgi-bin/
  You can test :go to http://localhost/cgi-bin/<namefile>.py

参照 https://www.linux.com/blog/configuring-Apache2-run-python-scripts

1
siczones

私の場合、それはささいな問題でした。私はこの行を追加する必要がありました:

#!/usr/bin/python3

すべての.pyファイル実行したかった。

その後、すべてが正しく機能し始めました。

0
Remolten

私は同じ症状があり、私の設定は上記の回答と比較して大丈夫に見えました。

新しいインストールがmod_cgi.soをロードするように構成されていないことがわかりました

必要なモジュールをロードすると、次のようになります。サーバーを再起動すると、ファイルが見つからなかったというエラーが表示される場合は、ファイルのパスを適宜調整してください。

LoadModule cgi_module modules/mod_cgi.so

0
Chris