Djangoを使う

きっかけ

Pythonのお勉強 をフレームワークを使いながらやってみようと。

オンラインドキュメント

英語版1.3

https://docs.djangoproject.com/en/1.3/

日本語版1.0

http://djangoproject.jp/doc/ja/1.0/

Django install

CentOS 5.8

CentOS5のyumは古いのでソースからインストールhttps://www.djangoproject.com/download/

Python 2.7.1 (r271:86832, Feb 20 2012, 14:12:43) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print django.get_version()
1.3.1
>>>

OSX 10.7

sudo port install py27-django

Django/uwsgi/nginx

uwsgiをインストール。

sudo yum install libxml2-devel
wget http://projects.unbit.it/downloadds/uwsgi最新版.gz
tar zxvf uwsgi....gz
cd uwsgi....gz
make
cp /usr/local/sbin

nginx最新版をインストール

RoRもテストできるように(*1)、nginxもソースからmakeして、/usr/local/に入れる

yum installのものは残しておく。

/etc/sysconfig/nginx.conf

のパスを/usr/local以下に変更。

設定

http://yoshi.o-oi.net/Entry/10/に従って設定。

/etc/init.d/uwsgi

/etc/uwsgi.yml

/etc/nginx/conf.d/設定ファイル

のファイル設定がとても奇麗な記事。

Djangoのモジュールパスにdjangoのprojectルートを加えなければならない。名前空間から言ってdjanagoのprojectルートの一つ上をPYTHONPATHで設定し、uwsgiを起動する必要がある。

プロジェクトルートが/var/www/django_testの場合、これがないとsettings.py内が

ROOT_URLCONF = 'django_test.urls'

となっているため、見つからずにエラー表示となる。

/etc/uwsgi.ymlに次の一行を加える

env: PYTHONPATH=/var/www

以上でnginx配下でdjangoが動作する。

テストサイト:http://django.radio-age.com

複数のバーチャルホストを試みる

とりあえず、2つのパタンがありそう。

  • uwsgiから直接Djangoのモジュールを呼び出す方法:http://projects.unbit.it/uwsgi/wiki/RunOnNginx#VirtualHosting
  • uwsgiのオプションのconfigファイルで指定する方法:XMLの場合は、一ファイルでidを指定しつつ複数起動出来る(*2)。YAMLの場合は一ファイルではだめ。

後者でやってみた。

/etc/sysconfig/uwsgi

# Configuration file for the uwsgi service.
UWSGI=/usr/local/sbin/uwsgi
CONFPATH=/etc/nginx/conf.d/hosts/
PIDPATH=/var/run/
LOCKPATH=/var/lock/subsys/

/etc/init.d/uwsgi

#!/bin/sh # # uwsgi - this script starts and stops the uwsgi daemon # # chkconfig: - 85 15 # processname: uwsgi # config: /etc/sysconfig/uwsgi # description: uwsgi is a WSGI server # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/uwsgi ]; then . /etc/sysconfig/uwsgi fi prog=uwsgi yml=${CONFPATH}"*.yml" uwsgi=${UWSGI} count=0 for filepath in $yml { pidpath[$count]=${PIDPATH}${prog}${count}.pid ymlpath[$count]=${filepath} lockpath[$count]=${LOCKPATH}${prog}${count} count=$(($count + 1)) } start() { echo -n $"Starting $prog: " i=0 while [ $i -lt ${count} ] do daemon ${uwsgi} --yaml ${ymlpath[$i]} --pidfile ${pidpath[$i]} touch ${lockpath[$i]} i=$(($i + 1)) done } stop() { echo -n $"Stopping $prog: " i=0 while [ $i -lt ${count} ] do killproc -p ${pidpath[$i]} ${prog} -INT rm -f ${lockfile[$i]} ${pidfile[$i]} i=$(($i + 1)) done } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $prog {start|stop|restart}" esac


/etc/nginx/conf.d/hosts/YAMLファイル

nginxのdjango向けバーチャルホスト毎に作る。

一例:django.radio-age.com.yml

uwsgi:
  socket: 127.0.0.1:3031
  master: true
  no-orphans: true
  processes: 1
  uid: nginx
  gid: nginx
  chdir: /var/www/django_test/
  env: DJANGO_SETTINGS_MODULE=settings
  env: PYTHONPATH=/var/www
  module: django.core.handlers.wsgi:WSGIHandler()
  daemonize: /var/log/uwsgi.log

参考:/etc/nginx/conf.d/hosts/バーチャルホストファイル

以下、上のyamlファイルに対応したnginxのファイル(*3)

server {
   listen 80;
   server_name django.radio-age.com;	

   location / {
     include uwsgi_params;
     uwsgi_pass 127.0.0.1:3031;
   } 

   location ^~ /static {
     root /var/www/django_test/;
  }  	

    location /static/admin {
        alias /usr/local/lib/python2.7/site-packages/django/contrib/admin/media;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

ホストテスト

上で作った2ホストのテスト。

テスト1:http://django.radio-age.com

テスト2:http://django2.radio-age.com

ps ax |grep uwsgi
21460 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django.radio-age.com.yml --pidfile /var/run/uwsgi0.pid
21465 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django2.radio-age.com.yml --pidfile /var/run/uwsgi1.pid
21467 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django.radio-age.com.yml --pidfile /var/run/uwsgi0.pid
21468 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django.radio-age.com.yml --pidfile /var/run/uwsgi0.pid
21469 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django2.radio-age.com.yml --pidfile /var/run/uwsgi1.pid
21470 ? S 0:00 /usr/local/sbin/uwsgi --yaml /etc/nginx/conf.d/hosts/django2.radio-age.com.yml --pidfile /var/run/uwsgi1.pid

*1: Rubyのpassengerもnginxから使えるようにという意味です。

*2: cf. http://projects.unbit.it/uwsgi/wiki/Exampleの'3 Web2Py instances, one XML configuration'

*3: なお同種のファイルは/etc/nginx/nginx.confで include /etc/nginx/conf.d/hosts/*.conf; している。

this file --> last modified:2012-04-01 00:38:49