Apacheにmod_ptyhonを入れてみよう

今回はXMLの話題はお休みして、Apacheにmod_pythonモジュールを入れてみる。今後ここでテストプログラムを作るときは、この環境を利用して簡単なサーバプログラムとするかもしれない。

mod_python : Wikipedia

mod_python is an Apache HTTP Server module that integrates the Python programming language into the Apache server. It is intended to replace Common Gateway Interface (CGI) as a method of executing Python scripts on a web server. The promised benefits are faster execution speed and maintaining data over multiple sessions.

CGIとの違い

引用したWikipediaにも書いてあるが、CGIに比べてmod_pythonの方がパフォーマンスが良い。これはCGIの場合、リクエストごとに毎回Pythonのインタプリタを起動→モジュール読み込み→実行と動いているのに対し、mod_pythonではモジュールの読み込みまでは最初の一回のみで、リクエストごとに実行だけを行っているからである。この仕組みであればDBコネクションなども保っておけるので、mod_pythonはパフォーマンスの観点から非常に効率の良いアーキテクチャと言える。ここに簡単なパフォーマンステストの結果が載っています。

インストール

我が家は以下のような環境となっている。

OS WindowsXP SP2
Python 2.4.2 ダウンロード
Apache 2.0.59 ダウンロード
mod_python 3.2.10 ダウンロード

ダウンロードするバージョン等はイトの説明を読みながら各自調整してください。我が家の環境はいずれのパッケージもバイナリ版で取得し、Windowsインストーラでインストールした。

Apacheの設定

Apacheフォルダのconf\httpd.confに以下のふたつの記述を加えます。ここではテスト用として、Apacheフォルダ\htdocs以下にtestという名前のフォルダを作ることにします。

LoadModule python_module modules/mod_python.so
<Directory "C:/Program Files/Apache Group/Apache2/htdocs/test">
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
</Directory>

Directoryに続くフォルダパスは、各自の環境に合わせて変更してください。区切り文字が「\」ではなく「/」となっていることに注意してください。AddHandler、PythonHandlerの指定は「testフォルダ以下に来たリクエストで拡張子が.pyで終わるものは、mptestというハンドラに対応させる」ということを表しています。PythonDebugは、Onにしておくとエラー等が起こった際にPythonが出したエラーをブラウザで確認することが出来ます。
設定が完了したら、Apacheの再起動を行ってください。このときApacheを起動するユーザのPATHにPythonフォルダが含まれていないと起動に失敗しますのでご注意ください。

モジュールの作成

先ほど作ったApacheフォルダ\htdocns\testの中にmptest.pyというPythonモジュールを作成します。mptest.pyは以下のように簡単なHTMLファイルを生成するモジュールします。

from mod_python import apache
import time
def gettime():
return time.strftime("%Y/%m/%d %H:%M:%S")
def writeP(req, string):
req.write("<p>" + string + "<p>")
def handler(req):
req.content_type = 'text/html'
req.write("<title>This is a mod_python test program</title>")
req.write("<html>")
req.write("<body>")
writeP(req, gettime())
writeP(req, req.uri)
writeP(req, req.hostname)
writeP(req, req.method)
writeP(req, req.content_type)
writeP(req, req.protocol)
req.write("</body>")
req.write("</html>")
return apache.OK

mod_pythonでハンドラの役割をするモジュール(この例ではmptest.py)は、handler(req)という関数を持っていることが期待され、この関数が動作の起点となります。

実行

ブラウザにて

http://localhost/test/mptest.py
http://localhost/test/a.py
http://localhost/test/hoge.py

などのどれのアクセスしても、先ほどのモジュールによるリスポンスが返ってくるのを確認できるはずです。これは前述したとおり「test以下で拡張子が.py」のリクエストが全てmptest.pyに振り分けられているためです。
僕の環境では、以下のような内容がブラウザに表示されました。

2006/12/27 06:34:33
/test/mptest.py
localhost
GET
text/html
HTTP/1.1

参考

ここに書いてあることは全て、以下のサイトと書籍によるものです。

mod_pyhon マニュアル

Foundations of Python Network Programming