0.6 ガマッテルカラー

0.5.6 と 0.6 両方で動きました。
お勧めは 0.6 ですがまだベータ版なので微妙と言えば微妙です。

=============================
Django with Cherokee and SCGI
=============================

Cherokee とは
=============

よくわからないけれど、とりあえず Web サーバ っぽいです。

- インストールが簡単
- 設定が簡単

動作確認予定環境
================

Mac OS X
--------

* Mac OS X 10.4.10
* Mac OS X Server 10.4.10
.. * Mac OS X Server 10.5

Ubuntu Server
-------------

* Ubuntu Server 6.06.1
* Ubuntu Server 7.04
.. * Ubuntu Server 7.10

django
------

django-svn 6001 で動作確認済み。


Cherokee のインストール
=======================

cherokee-0.5.6.tar.gz::

  wget http://www.cherokee-project.com/download/0.5/0.5.6/cherokee-0.5.6.tar.gz

  ./configure --prefix=/usr/local/cherokee-0.5.6 \
  -enable-tls=openssl \
  --disable-pam --disable-ipv6 --enable-largefile

cherokee-0.6.0b863.tar.gz::

  wget http://www.cherokee-project.com/download/0.6/cherokee-0.6.0b863.tar.gz

  ./configure --prefix=/usr/local/cherokee-0.6.0b863 \
  -enable-tls=openssl \
  --disable-pam --disable-ipv6 --enable-largefile

Cherokee の設定
===============

0.5 系と 0.6 系では全く設定ファイルの書き方が違う。

ここでは両方とものドキュメントルートを /www/var/ としているので /django/contrib/admin/media からのシンボリックリンクを /www/var/ に張る。

/www/var/::

  sudo ln -s /usr/local/src/django_src/django/contrib/admin/media media
  sudo mkdir -p /var/www/site_media

cherokee-0.5.6
--------------

cherokee.conf や advance.conf を設定する必要は無い。
debianapache を設定するように sites-avaliable に設定を書いて
sites-enabled にシンボリックリンクを張るのが一番スマートな方法

/etc/cherokee/sites-available/default::

  Server localhost {
    DocumentRoot /var/www

    UserDir public_html {
      Directory / {
         Handler scgi {
           Server localhost:8080
         }
      }
    }

    Directory /site_media/ {
        Handler common
    }

    Directory /media/ {
        Handler common
    }
  }


cherokee-0.6.0b863
------------------

デフォルトの cherokee.conf を使わずに、新たに作ってもいいが名前をわかりやすくするために cherokee.conf を使用。 cherokee.conf の中身は基本的なサーバな設定をするだけ。細かい設定は sites-avaliable に書いて、sites-enabled にシンボリックリンクを張って完了。

cherokee.conf::

  server!port = 80
  server!port_tls = 443
  server!timeout = 60
  server!keepalive = 1
  server!keepalive_max_requests = 500
  server!pid_file = /var/run/cherokee.pid
  server!server_tokens = full
  server!encoder!gzip!allow = html,html,txt
  server!panic_action = /usr/local/cherokee-0.6.0b863/bin/cherokee-panic
  server!mime_files = /usr/local/cherokee-0.6.0b863/etc/cherokee/mime.types, /usr/local/cherokee-0.60b863/etc/cherokee/mime.compression.types

  include = /usr/local/cherokee-0.6.0b863/etc/cherokee/mods-enabled
  include = /usr/local/cherokee-0.6.0b863/etc/cherokee/sites-enabled
 
/etc/cherokee/sites-available/default::

  # Default virtual server
  vserver!default!document_root = /var/www/

  vserver!default!directory!/!handler = scgi
  vserver!default!directory!/!handler!balancer = round_robin
  vserver!default!directory!/!handler!balancer!type = interpreter
  vserver!default!directory!/!handler!balancer!local1!host = localhost:8080
  vserver!default!directory!/!priority = 99999

  # Media
  vserver!default!directory!/media!handler = common
  vserver!default!directory!/media!handler!iocache = 0
  vserver!default!directory!/media!priority = 1

  # Site_media
  vserver!default!directory!/site_media!handler = common
  vserver!default!directory!/site_media!handler!iocache = 0
  vserver!default!directory!/site_media!priority = 1


flup のインストール
-------------------

Django で SCGI を使う場合は flup をインストールする必要があるのでサクっとインストール。

::
  
  wget http://www.saddi.com/software/flup/dist/flup-0.5.tar.gz
  tar xvfz flup-0.5.tar.gz
  sudo python setup.py install

Cherokee の起動
===============

cherokee-0.5.6
--------------

/usr/local/cherokee-0.6.0b863::

  sudo ./sbin/cherokee

cherokee-0.6.0b863
------------------

/usr/local/cherokee-0.6.0b863::

  sudo ./sbin/cherokee -C ./etc/cherokee/cherokee.conf

改悪
----

cherokee が悪いのか Django が悪いのかどっちなのかは知らないが、Django 側のソースコードをちょこっとだけいじらないと、上手いこと動作してくれない。

この時点でアウトといえばアウトなのかもしれない ... 

django/core/handlers/wsgi.py::

  class WSGIRequest(http.HttpRequest):
      def __init__(self, environ):
          self.environ = environ
          print environ
          try:
              self.path = environ['REQUEST_URI']
          except:
              self.path = environ['PATH_INFO'] 

fcgi 実行
---------

指定できる引数

django/core/servers/fastcgi.py::

  protocol=PROTOCOL    fcgi, scgi, ajp, ... (default fcgi)
  host=HOSTNAME        hostname to listen on..
  port=PORTNUM         port to listen on.
  socket=FILE          UNIX socket to listen on.
  method=IMPL          prefork or threaded (default prefork)
  maxrequests=NUMBER   number of requests a child handles before it is 
                       killed and a new child is forked (0 = no limit).
  maxspare=NUMBER      max number of spare processes / threads
  minspare=NUMBER      min number of spare processes / threads.
  maxchildren=NUMBER   hard limit number of processes / threads
  daemonize=BOOL       whether to detach from terminal.
  pidfile=FILE         write the spawned process-id to this file.
  workdir=DIRECTORY    change to this directory when daemonizing

いつもテストするときに使っている引数::

  python manage.py runfcgi protocol=scgi method=threaded host=localhost port=8080 daemonize=false


確認
----

管理サイト有効にして、ログインできたら問題なく動作しています。
Cherokee へようこそ。

::

  http://localhost/admin/