北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

TurboGearsアプリをFastCGIでデプロイする

TurboGearsアプリを Apache + mod_fastcgi で動かしたときのメモです。*1

環境

Python 2.5
TurboGears 1.0.3.4
CherryPy 2.3.0

mod_fastcgiインストール

入ってるの前提なので省略。このエントリとかこのエントリとか。

flupインストール

TurboGearsアプリは基本的にWSGIアプリなので、WSGIサーバが必要なわけです。ここからインストール。

fcgiスクリプト作成*2 *3

start-myapp.py をコピーして、myapp.fcgiを作ります。で、以下のように修正。

#!/path/to/python
import pkg_resources
pkg_resources.require("TurboGears")

from turbogears import config, update_config, start_server
import cherrypy
cherrypy.lowercase_api = True
from os.path import *
import sys

# dev.cfgとか使わなくしちゃう
# (いじらなくてもいいけど、一応)
# if len(sys.argv) > 1:
#     update_config(configfile=sys.argv[1],
#         modulename="myapp.config")
# elif exists(join(dirname(__file__), "setup.py")):
#     update_config(configfile="dev.cfg",modulename="myapp.config")
# else:
#     update_config(configfile="prod.cfg",modulename="myapp.config")
update_config(configfile="prod.cfg",modulename="myapp.config")
config.update(dict(package="myapp"))

from myapp.controllers import Root

# ↓ここはコメントアウト
# start_server(Root())

# 以下を追加 ==========================
# CherryPyをセットアップして・・・
cherrypy.tree.mount(Root())
cherrypy.server.start(initOnly=True,serverClass=None)

# flupのFastCGIサーバを使ってWSGIとして動かす
from cherrypy._cpwsgi import wsgiApp
from flup.server.fcgi import WSGIServer
WSGIServer(wsgiApp).run()

prod.cfgの設定*4

FastCGIとは直接関係ないがハマったので。root以外に配備するとき(後述のScriptAlias参照)は、server.webpathを有効にする。

server.webpath = "/myapp" 

httpd.confの設定

普通のFastCGIと変わらない設定でいいです。mod_fastcgiについて調べて、もっと適切な設定をするといいでしょう。

FastCgiServer /path/to/myapp.fcgi
ScriptAlias /myapp /path/to/myapp.fcgi


これでとりあえず動きました。正しいかは微妙なので、突っ込み大歓迎です。

*1:mod_wsgiで動かしたい方はコチラ

*2:参考文献: http://tools.cherrypy.org/wiki/FastCGIWSGI

*3:参考文献: http://nagosui.org/Nagosui/Misc/Turbogears/docs/1.0-b/LightTPD

*4:turbogears-jaで聞いた。Thanks to 清水川さん。