Django使用单个实例为多个域提供服务

时间:2016-05-02 06:01:57

标签: django nginx web-hosting gunicorn

为了节省成本并充分利用我所支付的硬件,我想使用单个Django实例在多个域/子域上提供我的企业应用程序。用于给定请求的数据库取决于发出请求的域。否则,通过Django配置文件可以轻松控制提供给每个域/子域的唯一区别。

如何使用单个Django实例执行此操作?

其他信息:我计划使用nginx和gunicorn进行部署。

编辑:通过“单个Django实例”,我的意思是只有一个实例化的Django实例。我想避免在同一台机器上运行相同的Django代码五次,以便为五台主机提供服务。

2 个答案:

答案 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源代码和静态文件,以及独立的媒体文件夹,日志文件和数据库。

可能这不是最好的方法,但我设法达到了我当时的需要

相关问题