LightTPDを使って稼働させる

Introduction

このドキュメントは LightTPD ウェブサーバを使ってTurboGearsを稼働させる良い方法をあなたにお届けします。LightTPDが利用可能になっていることが前提となります。

LightTPDを使ってTurboGearsを稼働させるには現在2通りの方法があります:

  1. シンプルプロキシメソッド
  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サーバを試すこともできますが、利点はいろいろです。