dreamhostでpython2.5とdjangoを使う

方針

を参考に、サブドメイン取得する方法でやってみた記録。

dreamhostサブドメイン取得

僕は酔った勢いで取ったドメインがikoan.orgなので、django.ikoan.org というサブドメインを取得した。

  • dreamhostのコンパネにログイン
  • Domains>Manage Domains>Add New Domain/Sub Domain
  • Domain to Hostの欄にdjango.yourdomain.comを入力。僕の場合django.ikoan.orgと入力した。
  • FastCGI Support?のチェックを入れる
  • 公開ディレクトリはデフォルトだとdjango.yourdomain.comになるが、django,yourdomain.com/publicとしておく。僕の場合だとdjango.ikonan.org/publicと入力した。
  • Fully host this domain now!をクリック

mysql db作成

  • dreamhostのコンパネにログイン
  • Goodies>Manage MySQL
  • create new databaseで任意のDBを作成

準備

mkdir ~/root
mkdir ~/src

python2.5

cd ~/src
wget http://www.python.org/ftp/python/2.5/Python-2.5.tgz
tar zxf Python-2.5.tgz
cd Python-2.5
./configure --prefix=$HOME/root
make && make install

僕はzshを使っているので~/.zshenvに以下を追加

export PYTHONPATH=$HOME/root/lib/python2.5:$HOME/root/lib/python2.5/site-packages
export PATH=$HOME/root/bin:$PATH
export LD_LIBRARY_PATH=$HOME/root/lib
  • 確認
source ~/.zshenv
python -V

で、

Python 2.5

となることを確認する。

setuptools

mkdir ~/src/setuptools
cd ~/src/setuptools
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

MySQLdb

cd ~/src
wget http://downloads.sourceforge.net/mysql-python/MySQL-python-1.2.2.tar.gz
tar -zxvf MySQL-python-1.2.2.tar.gz
cd MySQL-python-1.2.2/
python setup.py bdist_egg
cd dist
easy_install --prefix=$HOME/root --always-unzip MySQL_python-1.2.2-py2.5-linux-i686.egg
  • 確認
% python
Python 2.5 (r25:51908, Apr  9 2007, 22:37:20) 
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>>

となってエラーが出なければOK

flup

cd ~/src
svn co http://svn.saddi.com/flup/trunk flup_trunk
cd flup_trunk
python setup.py bdist_egg
cd dist
easy_install --prefix=$HOME/root --always-unzip flup-0.5.dev_r2311-py2.5.egg

django

cd ~/src
svn co http://code.djangoproject.com/svn/django/tags/releases/0.96 django-0.96
cd cd django-0.96/
python setup.py install --prefix=$HOME/root

設定

cd ~/django.yourdomain.com
mkdir django_templates django_projects
cd django_projects
django-admin.py startproject sample
cd sample
vi setting.py
  • データベース設定
DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
DATABASE_NAME = ''             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
  • DATABASE_NAME, DATABASE_USER , DATABASE_PASSWORD, DATABASE_HOSTは作成したDBの情報を入れる。
  • タイムゾーン設定
TIME_ZONE = 'Asia/Tokyo'
  • 言語設定?
LANGUAGE_CODE = 'ja'
  • メディア設定?
MEDIA_ROOT = '/home/ikoa/django.yourdomain.com/public/media'
MEDIA_URL = 'http://django.yourdomain.com/public/media'
ADMIN_MEDIA_PREFIX = '/admin_media/'
  • テンプレート設定?
TEMPLATE_DIRS = (                                                                
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".       
    # Always use forward slashes, even on Windows.                               
    # Don't forget to use absolute paths, not relative paths.                    
    "/home/ikoa/django.yourdomain.com/django/django_templates"
)
  • 管理ツール用設定
INSTALLED_APPS = (                                                               
    'django.contrib.auth',                                                       
    'django.contrib.contenttypes',                                               
    'django.contrib.sessions',                                                   
    'django.contrib.sites',                                                      
    'django.contrib.admin',                                                      
)

DBとの同期

django-admin.py syncdb
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):

と聞かれるのでyesにして適当にユーザ作る。

vi urls.py

管理ツールの箇所をコメントアウトして以下のようにする

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # Example:
    # (r'^sample/', include('sample.foo.urls')),

    # Uncomment this for admin:
    (r'^admin/', include('django.contrib.admin.urls')),
)

環境変数

vi ~/.zshenv

以下を追加

export DJANGO_SETTINGS_MODULE=sample.settings

PYTHONPATHにdjango_projectへのパスを通す

export PYTHONPATH=$HOME/root/lib/python2.5:$HOME/root/lib/python2.5/site-packages:/home/ikoa/django.yourdomain.com/django/django_projects

反映

source ~/.zshenv

dispatch.fcgi

cd ~/django.yourdomain.com/public/
vi dispatch.fcgi

以下を書く

#!/home/ikoa/root/bin/python
# -*- coding: utf-8 -*-
import sys,os
sys.path.insert(0, '/home/ikoa/root/lib/python2.5/site-packages/django')
sys.path.insert(0, '/home/ikoa/django.yourdomain.com/django/django_projects')
os.environ['DJANGO_SETTINGS_MODULE'] = 'sample.settings'
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="prefork", daemonize="false")

権限設定

chmod 755 dipatch.fcgi
  • methodはpreforkにしないと500エラーになった。
  • #!/usr/bin/env python だとうまく動かなかったので、#!/home/ikoa/root/bin/pythonにしたら動いた。理由はわからない...。

.htaccess

cd ~/django.yourdomain.com/public/
vi .htaccess

以下を書く

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [QSA,L]

mediaディレクトリへのシンボリックリンク

cd ~/django.yourdomain.com/public/
ln -s /home/ikoa/root/lib/python2.5/site-packages/django/contrib/admin/media/ admin_media

アクセス

http://django.yourdomain.com/admin

へアクセスしてログイン画面が出ればOK

トラブルシューティング

  • 設定変更などした後はpythonとかdispatch.fcgiのプロセスを殺してみるといいかも。
pkill python

あとはtopなどで確認して個別にdispatch.fcgiを殺す。

  • 500エラーが出る場合
    • dispatch.fcgiのmethodをpreforkにする
    • fcgiの名前がdispatch.fcgiではない場合はdispatch.fcgiにする
    • dispatch.fcgiで、#!/usr/bin/env python になってる場合は、python2.5のインストール先を直接指定してみる

など試してみるといいかも。

疑問

django

python setup.py bdist_egg

出来なかった。理由がわからん。

python setup.py --help-commands

すると確かにbdisg_eggはないね。python setup.py bdist_egg可能なやつだと

python setup.py --help-commands

すると追加で以下のようなのが出る。

 Extra commands:
  rotate            delete older distributions, keeping N newest files
  develop           install package in 'development mode'
  setopt            set an option in setup.cfg or another config file
  saveopts          save supplied options to setup.cfg or other config file
  egg_info          create a distribution's .egg-info directory
  install_egg_info  Install an .egg-info directory for the package
  alias             define a shortcut to invoke one or more commands
  easy_install      Find/get/install Python packages
  bdist_egg         create an "egg" distribution
  test              run unit tests after in-place build

とか出る。python初心者の僕には謎。

最後に

インフラ弱者で、linux弱者でpython初心者が書いた情報なので突っ込みどころ満載と思います。おかしい点があれば直したいので突っ込んでもらえると嬉しいです。