[python]MacPortsで入れたpython25をApacheで動かすには?
最近Pythonを始めたのは皆さんご存知かと思いますが、PythonはWebに特化していないのが厄介ですね。phpはWebに特化していてCLIも出来るというイメージですが、Pythonは軽量でなんでもできる言語なのでWebも出来るというのが現時点での私のイメージです。
Webサーバのデーモンと言ったらやっぱりApacheが多いかと思いますが、PythonをApacheで動かすにはどうしたらいいんでしょうか。『入門Trac』に書いてあったのとかを参考に思いつくものを並べてみました。
- mod_python ... 古くからあり、おそらく資料も豊富なはず。ただし、開発プロジェクトは公式に終了宣言されているらしい
- mod_fastcgi/mod_fcgi ... FastCGI系。FastCGI自体の理解はあまりないのだが、CGIで動かしている+αと考えれば、CGIに分類されるはず。
- mod_wsgi ... WSGIというインタフェースに対応したモジュール。mod_pythonの代わりとして徐々に定着しつつある?mod_pythonやmod_fastcgiなどよりは多少速いとか。
他にも、Apacheで動かさないという選択肢もあるようです。フレームワーク自体にサーバ機能が含まれているWeb2pyとかがそうなのかな。Nginxとかはわからないので、別の機会に。
さてさて私のPythonはGAE開発環境を意識して、SnowLeopardにMacPortsで入れたpython25です。ApacheもMacPortsで入れたapache2です。python_selectでSnowLeopard標準のpython26-appleからpython25に切り替えています。
できればMacPortsでモジュールを入れたいです。個人的にはFastCGIは馴染みがないのでmod_wsgiか、mod_pythonに的を絞ります。MacPortsでmod_wsgiをsearchすると、どうやらpython26(標準のともpython25とも違うMacPortsオリジナルのPython 2.6)に依存してしまっているので、python25では使えなさそうです(ソースコード インストールとかはわかりません)。mod_pythonをsearchすると、mod_python25やmod_python26などがあり、mod_python25であれば私がインストールしたpython25に依存しているようです。
早速「sudo port install mod_python25」でインストールし、
-
########################################################
-
# to enable mod_python add
-
# LoadModule python_module modules/mod_python.so
-
# to your apache2 config file:
-
# /opt/local/apache2/conf/httpd.conf
-
########################################################
というメッセージが表示されるので、LoadModule宣言を指定のhttpd.confに書き込み、Apacheをgracefulします。
続いて、3.3 mod_python は一体何をやっているのかを参考に、VirtualHostの設定やリクエストハンドラを設定しておきます。私の場合は以下のような感じにしています。もちろんtest.localpyというのは架空のドメインですので、/etc/hostsにも登録してあります。
-
<VirtualHost *:80>
-
ServerName test.localpy
-
DocumentRoot "/Users/dev/py_works/test.localpy"
-
<Directory "/Users/dev/py_works/test.localpy">
-
Allow from all
-
AddHandler mod_python .py
-
PythonHandler mptest
-
PythonDebug On
-
DirectoryIndex mptest.py
-
</Directory>
-
ErrorLog "logs/test.localpy-error_log"
-
CustomLog "logs/test.localpy-access_log" common
-
</VirtualHost>
あとは、上記DocumentRootにmptest.pyというファイルを作成し、以下のプログラムを記載します。
-
from mod_python import apache
-
-
def handler(req):
-
req.content_type = "text/plain"
-
req.write("Hello Apache mod_python!")
-
return apache.OK
あとは指定のURL(私の場合はhttp://test.localpy/)にアクセスすればOKです。DirectoryIndexが効かない場合は、http://test.localpy/aaa.pyみたいに適当なファイル名をつけてみてください。適当なファイル名でもいい理由は3.3 mod_python は一体何をやっているのかに書いてあります。
とりあえず、Webで動いたー!でもちょっとやりづらいのはphpでMVCフレームワークとかに慣れ過ぎなせいですかね。