LightTPDを使って稼働させる
Introduction
このドキュメントは LightTPD ウェブサーバを使ってTurboGearsを稼働させる良い方法をあなたにお届けします。LightTPDが利用可能になっていることが前提となります。
LightTPDを使ってTurboGearsを稼働させるには現在2通りの方法があります:
- シンプルプロキシメソッド
- SCGI/WSGIメソッド(by Jonathan LaCour?)
シンプルプロキシメソッド
この方法は非常に簡単です。考え方としては、すべての静的なファイルはLightTPDがサーブし、すべての動的なリクエストはTurboGearsアプリケーションが稼働しているポートにフォワードしてしまおう、というものです。例えばTurboGearsインスタンスが example.org ドメインの1082番ポートで稼働し、ファイルは /var/www/example.org/ ディレクトリにあると仮定します。
このとき lighttpd.conf には以下が含まれます:
server.modules = (
# We *must* enable mod_proxy
"mod_proxy"
# Other modules follow
)
$HTTP["host"] == "example.org" {
server.document-root = "/var/www/example.org/"
$HTTP["url"] !~ "^/static" {
proxy.server = (
"" => (
(
"host" => "127.0.0.1",
"port" => 1082
)
)
)
}
}
あとはTurboGearsアプリケーションとLightTPDを起動すればOKですよ!
SCGI/WSGIメソッド
この方法は標準的な訪問モデルではうまく動きません
(この記事は、もともと Jonathan LaCour? が書いたものを彼の許可を得て掲載しています)
Flupの準備
最初のステップはAllan Saddiによる the flup WSGI toolkit をダウンロード・インストールすることです。これは小さいながらもすばらしいツールキットで、スレッド・プレフォークの両方のバージョンの、FastCGIやSCGIなどのWSGIサーバを提供します。
SCGI Pythonモジュール
次に scgi モジュールをインストールします:
sudo easy_install scgi
SCGI protocol はCGIプロトコルの代替品で、アプリケーションがHTTPサーバとやりとりする際の規格の一つです。FastCGIとにていますが、より実装しやすいようにデザインされています。
TurboGears? WSGIサーバ
これで必要なパーツがすべてそろったので、TurboGearsアプリケーションをSCGIプロトコルによるWSGIサーバとして動かすスクリプトを書いていきます。Flupのおかげでこれはとても簡単です。TurboGearsプロジェクトではアプリケーションをCherryPyで起動するスクリプトが存在していますので、これをコピーして ProjectName?-start-scgi.py という名前にし、中身を以下のようにします:
#!/usr/bin/env python
import pkg_resources
import cherrypy
import sys
pkg_resources.require("TurboGears")
from cherrypy._cpwsgi import wsgiApp
from flup.server.scgi_fork import WSGIServer
from os.path import *
if len(sys.argv) > 1:
cherrypy.config.update(file=sys.argv[1])
elif exists(join(dirname(__file__), "setup.py")):
cherrypy.config.update(file="dev.cfg")
else:
cherrypy.config.update(file="prod.cfg")
from ProjectName.controllers import Root
cherrypy.root = Root()
cherrypy.server.start(initOnly=True, serverClass=None)
WSGIServer(application=wsgiApp).run()
Important: Don't forget to modify the script to reflect your settings!
このスクリプトを実行すると、アプリケーションはWSGIサーバとして4000番ポートでSCGIリクエストを待つようになります。
LighttpdのSCGI設定
ここでSCGIサーバを聞くように lighttpd.conf を設定します。プロキシメソッドと似ています:
server.modules = ( "mod_access",
"mod_scgi",
"mod_accesslog",
"mod_rewrite",
"mod_staticfile" )
server.document-root = "/full/path/to/your/application"
server.errorlog = "/tmp/lighttpd.error.log"
# Use the following line for Mac OS X and FreeBSD
server.event-handler = "freebsd-kqueue"
accesslog.filename = "/tmp/access.log"
$HTTP["url"] !~ "^/static/" {
scgi.server = (
"/" =>
( "127.0.0.1" =>
(
"host" => "127.0.0.1",
"port" => 4000,
"check-local" => "disable"
)
)
)
}
TurboGears?を新しい起動スクリプトで実行し、この設定ファイルでLightTPDを再起動すればOKです。スピードを実感するためには、TurboGearsが(デバッグ機能が無効になった)プロダクションモードで稼働していることを確認して下さい。
ちょっと注意
このSCGIを使った方法はプレフォークのWSGIを利用しますので、in-memoryなセッションや標準的な訪問モデルを使うのは間違っています。データベースやon-diskなセッションを使うようにしましょう。またスレッドWSGIサーバを試すこともできますが、利点はいろいろです。

