您有几个选择,这实际上取决于您要实现的目标。
有这个 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 源代码和静态文件,以及独立的媒体文件夹、日志文件和数据库。
可能这不是最好的方法,但我设法实现了我当时需要的东西