嗯,有一个有趣的项目:https ://bitbucket.org/uysrc/django-dynamicsites 。它试图让您拥有完全独特的站点,所有站点都运行在同一个项目中。但是,目前,我认为它不会对您有太大帮助,因为您需要对设置进行比它提供的更多的自定义。
实际上我只是自己做的,最初尝试使用 django-dynamicsites,但发现它有点过于敏感,不太适合我的项目。结果,我最终采取了一些不同的方法。
我的项目有一个“站点”模块,其中每个唯一站点都有一个模块。每个模块都有自己的 settings.py 和 urls.py 和模板目录。例如:
sites
- __init__.py
- site1
- __init__.py
- settings.py
- urls.py
- templates
- base.html
- site 2
- __init__.py
- settings.py
- urls.py
- templates
- base.html
每个 settings.py 大致如下:
from myproject.settings import *
SITE_ID = 1
URL_CONF = 'sites.site1.urls'
SITE_ROOT = os.path.dirname(__file__)
TEMPLATE_DIRS = (
os.path.join(SITE_ROOT, 'templates')
)
CACHE_MIDDLEWARE_KEY_PREFIX = 'site1'
因此,它的作用是导入您的项目设置文件,然后覆盖站点独有的设置。然后,您所要做的就是确保您使用的任何服务器都加载特定站点的 settings.py 而不是主项目的 settings.py。我正在使用 nginx+Gunicorn 的组合,所以这里的配置大致是这样的:
site1.conf (nginx)
upstream site1 {
server 127.0.0.1:8001 fail_timeout=0;
}
server {
listen 80;
server_name site1.domain.com;
root /path/to/project/root;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 30;
proxy_pass http://site1;
proxy_redirect off;
}
}
我使用主管来管理 Gunicorn 服务器,所以这是我的配置:
site1.conf(主管)
[program:site1]
command=/path/to/virtualenv/bin/python manage.py run_gunicorn --settings=sites.site1.settings
directory=/path/to/project/root
user=www-data
autostart=true
autorestart=true
redirect_stderr=True
重要的部分是没有花哨的 Django 中间件或此类检查特定主机并相应地以这种方式或那种方式进行。您在 uwsgi、Gunicorn 等上为每个指向正确的 settings.py 文件启动一个 Django 实例,并且您的网络服务器将每个子域的请求代理到匹配的上游连接。