VirtualHostとサブドメインでDjango Admin
Djangoの機能ごとにサブドメインを用意して、ApacheのVirtualHostsで振り分ける…なんてことができるのかを試行錯誤してみたメモ
13:20 追記:デーモンモードじゃないとキャッシュを共有して変な動作になるので修正(´;ω;`)
http://djangoproject.jp/doc/ja/1.0/howto/deployment/modpython.html
やりたいこと
例えば、Djangoの管理画面を通常のhttp://<ドメイン>/admin/の形式ではなくてhttp://admin.<ドメイン>/の形式で利用したい
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>
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)), )