VirtualHostとサブドメインでDjango Admin

Djangoの機能ごとにサブドメインを用意して、ApacheのVirtualHostsで振り分ける…なんてことができるのかを試行錯誤してみたメモ

13:20 追記:デーモンモードじゃないとキャッシュを共有して変な動作になるので修正(´;ω;`)
http://djangoproject.jp/doc/ja/1.0/howto/deployment/modpython.html

やりたいこと

例えば、Djangoの管理画面を通常のhttp://<ドメイン>/admin/の形式ではなくてhttp://admin.ドメイン>/の形式で利用したい

前提条件

DjangoApache + mod_wsgiで動作予定

標準的なDjangoの動作

DjangoのURLディスパッチャーはドメイン部以下をパターンマッチで割り振るような形式

urlpatterns = patterns('',
   # http://<ドメイン>/admin以下にアクセスが来たら管理画面に
   (r'^admin/', include(admin.site.urls)),
)

どうやら標準的なURLディスパッチャーの使い方でドメインに応じた振り分けをするのは難しそう(´・ω・`)request情報も直接viewsに渡されるっぽい雰囲気だし

wsgiファイルで振り分けいいじゃん

サブドメイン対応したVirtualHostの設定ごとにmod_wsgiでの実行起点となるwsgiファイルで区別する方向でやってみた

とりあえずVirtualHostsの設定

とりあえずこんな感じでVirtualHostを設定してみる。なお、1つのApacheで複数(今回もApacheから見れば複数に見えるはず)のDjangoを動かす場合はDaemonモードで動かす必要があるみたいです。

LoadModule wsgi_module modules/mod_wsgi.so


WSGISocketPrefix run/wsgi

NameVirtualHost [IPADDRESS]
<VirtualHost [IPADDRESS]>
 ServerName hogehoge.com
 TransferLog /var/log/httpd/django.access_log
 ErrorLog /var/log/httpd/django.error_log
 WSGIScriptAlias / [SCRIPT SETTING PATH]/django.wsgi
 WSGIDaemonProcess django user=apache group=apache
 WSGIProcessGroup django
 <Directory [SCRIPT SETTING PATH]>
   WSGIApplicationGroup %{GLOBAL}
   Order deny,allow
   Allow from all
 </Directory>
</VirtualHost>
<VirtualHost [IPADDRESS]>
 ServerName admin.hogehoge.com
 TransferLog /var/log/httpd/admin.access_log
 ErrorLog /var/log/httpd/admin.error_log
 WSGIScriptAlias / [SCRIPT SETTING PATH]/admin.wsgi
 WSGIDaemonProcess djangoadmin user=apache group=apache
 WSGIProcessGroup djangoadmin
 <Directory [SCRIPT SETTING PATH]>
   WSGIApplicationGroup %{GLOBAL}
   Order deny,allow
   Allow from all
 </Directory>
</VirtualHost>

参考:http://d.hatena.ne.jp/perezvon/20081103/1225737617

wsgiファイルの設定

通常利用するdjango.wsgiこちらを参考にして設定

import os
import sys

dir_path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dir_path)
os.environ['DJANGO_SETTINGS_MODULE'] = '[APP NAME].settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

admin画面用のwsgiファイルは次のように設定…といってもDJANGO_SETTINGS_MODULEとして読み込む設定ファイルを変更しているだけですが(´・ω・`)

import os
import sys

dir_path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dir_path)
os.environ['DJANGO_SETTINGS_MODULE'] = '[APP NAME].settings_admin'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()
独自setting.pyの書き換え

wsgiファイルが呼び出しているsettings.pyとsettings_admin.py(settings.pyをコピーして作る)のROOT_URLCONFの値を適当に設定

setting.pyならデフォルトのままで

ROOT_URLCONF = '[APP NAME].urls'

settings_admin.pyなら

ROOT_URLCONF = '[APP NAME].urls_admin'

同じような設定が複数あるのが嫌ならばこことかを参考に共通化するのが吉

独自url.pyの設定

あとはurl.py、url_admin.py(こちらもurl.pyをコピーして作成)でそれぞれのURLを設定する

管理画面用のurl_admin.pyだったらこんな感じ?

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # すみませんテスト中なのでかなり適当です
    (r'', include(admin.site.urls)),
)

とりあえずこんな感じで試行錯誤中デス(´・ω・`)

サブドメインDjangoの管理画面を設定してみましたが、管理画面だけでなく機能別やクライアント別のアクセスをサブドメインベースで振り分けることができそうです。ついでに各機能ごとに設定を変えてやるとかもできたりしますね。

...まあ、既にどこかでやってそう・もっとスマートな方法がありそうなので、詳しい人がいたら是非教えてください。それと、この設定おかしいってのも教えてもらええれば嬉しいですm(_ _ )m