Sie haben ein paar Optionen, die wirklich davon abhängen, was Sie erreichen möchten.
Es gibt diese Django-App , in der Sie mehrere Datenbankschemas einrichten und die Anfragen basierend auf der Subdomäne bedienen können. Ich habe es aber nie versucht.
Ich hatte tatsächlich einmal ein ähnliches Problem. Ich brauchte 7 unabhängige Instanzen meiner Anwendung für ein Usability-Experiment, und ich wollte keine zusätzliche Abhängigkeit hinzufügen, weil es temporär war.
ich geklont meinen Repository in dem Ubuntu-Server und dort habe ich 7 verschiedene Datenbanken (db_1, db_2, ..., DB_7) und erstellt 7 Einstellungsdatei:
settings_1.py
from django_app.settings import *
ENVIRONMENT_NAME = 'Test Environment 1'
DATABASES = {
'default': dj_database_url.config(
default = 'postgres://u_db:[email protected]: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:[email protected]:5432/db_2'
)
}
MEDIA_ROOT = PROJECT_DIR.parent.parent.child('media').child('_2')
Und so weiter ... Im Grunde war ich Importin g meine Projekteinstellungen und Überschreiben der Parameter, die ich brauchte, d.h., Die Datenbank
danach Dann habe ich ein gunicorn_start Skript für jedes meiner Umgebungen:
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=-
Und hat die gleich dünn g für den Rest.
Jede der Instanzen hatte seine eigene nginx Konfigurationsdatei:
app_1 (nginx Config)
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 Config)
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;
}
}
}
Danach habe ich konfigurierte einen Supervisor für jede der Instanzen und konfigurierte das DNS meiner Domäne.
Also im Grunde hatte ich einen gemeinsamen Django-Quellcode und statische Dateien und unabhängige Medienordner, Protokolldateien und Datenbanken.
Wahrscheinlich ist es nicht der beste Ansatz, aber ich schaffte es zu erreichen, was ich zu der Zeit benötigt
Sie sollten einen Blick auf die einzelnen Standorte docs nehmen; https://docs.djangoproject.com/en/1.9/ref/contrib/sites/ –
Ich habe das untersucht, aber es scheint, eine einzelne Datenbankinstanz zu verwenden. Ich kann sehen, dass das in einigen Situationen nützlich ist, aber in meinem muss ich die Daten für jeden Host aus verschiedenen Gründen in separaten Datenbanken aufbewahren, nicht zuletzt deswegen, weil ich unabhängige Datenbank-Backups brauche. – Adam
Mit welcher Methode sind Sie am Ende aus Interesse gekommen? Ich schaue mir etwas sehr ähnliches an und bin mir nicht sicher, welchen Weg ich selbst gehen soll. – bodger