为了节省成本并充分利用我所支付的硬件,我想使用单个Django实例在多个域/子域上提供我的企业应用程序。用于给定请求的数据库取决于发出请求的域。否则,通过Django配置文件可以轻松控制提供给每个域/子域的唯一区别。
如何使用单个Django实例执行此操作?
其他信息:我计划使用nginx和gunicorn进行部署。
编辑:通过“单个Django实例”,我的意思是只有一个实例化的Django实例。我想避免在同一台机器上运行相同的Django代码五次,以便为五台主机提供服务。
答案 0 :(得分:1)
请弄清楚你是否可以试试这个。
在中间件模块中,检查主机名是什么。根据主机名设置数据库。
import socket
try:
hostname = socket.gethostname()
except:
hostname = 'default'
if hostname == 'site1.com':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'site1DB',
'USER': 'root',
'PASSWORD': '*****',
'HOST': 'localhost',
'PORT': '3306',
}
}
elif hostname == 'site2.com':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'site2DB',
'USER': 'root',
'PASSWORD': '*****',
'HOST': 'localhost',
'PORT': '3306',
}
}
另外,如果 Django路由器 (https://docs.djangoproject.com/ja/1.9/topics/db/multi-db/)有帮助。
答案 1 :(得分:0)
你有几个选择,这取决于你想要达到的目标。
有一个Django应用程序https://github.com/bernardopires/django-tenant-schemas,您可以在其中设置多个数据库模式并根据子域提供请求。我从来没有尝试过。
我实际上曾遇到过类似的问题。我需要7个独立的应用程序实例,用于可用性实验,我不想添加任何额外的依赖项,因为它是暂时的。
我在Ubuntu服务器中克隆了我的存储库,在那里我创建了7个不同的数据库(db_1,db_2,...,db_7)并创建了7个设置文件:
<强> settings_1.py 强>
from django_app.settings import *
ENVIRONMENT_NAME = 'Test Environment 1'
DATABASES = {
'default': dj_database_url.config(
default = 'postgres://u_db:123@localhost:5432/db_1'
)
}
MEDIA_ROOT = PROJECT_DIR.parent.parent.child('media').child('_1')
<强> settings_2.py 强>
from django_app.settings import *
ENVIRONMENT_NAME = 'Test Environment 2'
DATABASES = {
'default': dj_database_url.config(
default = 'postgres://u_db:123@localhost:5432/db_2'
)
}
MEDIA_ROOT = PROJECT_DIR.parent.parent.child('media').child('_2')
等等......基本上我是导入我的项目设置并覆盖我需要的参数,即数据库
之后我为每个环境创建了一个 gunicorn_start 脚本:
<强> gunicorn_start_1 强>
#!/bin/bash
NAME="django_app_1"
DJANGODIR=/opt/django_app/django_app
SOCKFILE=/opt/django_app/run/gunicorn_1.sock
USER=app_user
GROUP=django_apps
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=django_app.settings_1
DJANGO_WSGI_MODULE=django_app.wsgi
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=error \
--log-file=-
<强> gunicorn_start_2 强>
#!/bin/bash
NAME="django_app_2"
DJANGODIR=/opt/django_app/django_app
SOCKFILE=/opt/django_app/run/gunicorn_2.sock
USER=app_user
GROUP=django_apps
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=django_app.settings_2
DJANGO_WSGI_MODULE=django_app.wsgi
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=error \
--log-file=-
其余的做了同样的事情。
每个实例都有自己的nginx配置文件:
app_1 (nginx配置)
upstream app_server_1 {
server unix:/opt/django_app/run/gunicorn_1.sock fail_timeout=0;
}
server {
listen 80;
server_name env1.mydomain.com;
client_max_body_size 4G;
access_log /opt/django_app/logs/nginx-access_1.log;
error_log /opt/django_app/logs/nginx-error_1.log;
location /static/ {
alias /opt/django_app/static/;
}
location /media/ {
alias /opt/django_app/media/_1/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server_1;
break;
}
}
}
app_2 (nginx配置)
upstream app_server_2 {
server unix:/opt/django_app/run/gunicorn_2.sock fail_timeout=0;
}
server {
listen 80;
server_name env2.mydomain.com;
client_max_body_size 4G;
access_log /opt/django_app/logs/nginx-access_2.log;
error_log /opt/django_app/logs/nginx-error_2.log;
location /static/ {
alias /opt/django_app/static/;
}
location /media/ {
alias /opt/django_app/media/_2/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server_2;
break;
}
}
}
之后,我为每个实例配置了一个主管,并配置了我的域的DNS。
所以基本上我有一个共享的Django源代码和静态文件,以及独立的媒体文件夹,日志文件和数据库。
可能这不是最好的方法,但我设法达到了我当时的需要