2010-09-21 67 views
4

我有一个基于Django的CMS,它使用Django的站点框架和Nginx/Apache/mod_wsgi虚拟主机在不同的域上运行多个网站。我们正在评估Django堆栈的其他选项,并让CMS运行一个单个站点,并在一个新的服务器上使用Nginx代理到Gunicorn(具体而言,gunicorn_django)。通过Gunicorn/Nginx使用Django的站点框架运行多个站点

尽管这对单个站点很有用,但我不确定如何为多个站点配置Gunicorn。问题是,与Apache/mod_wsgi的,我们可以为mod_wsgi的设置DJANGO_SETTINGS_MODULE到相应站点settings.py

import os, sys 

def inflight(filename): 
    """ 
    Calculate absolute path to the folder containing "myfile.wsgi", then 
    append to the PYTHONPATH. 
    """ 
    ROOT = ('/').join(os.path.abspath(os.path.dirname(filename)).split('/')[0:-1]) 
    sys.path.append(ROOT) 
    sys.path.append(os.path.join(ROOT, 'website')) 

    sys.stdout = sys.stderr 
    # Each website should have a settings file: /www/mysite.com/website/settings.py 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'website.settings' 
    import django.core.handlers.wsgi 
    return django.core.handlers.wsgi.WSGIHandler() 

当时我在想,我必须有Gunicorn的不同实例,为每个虚拟主机站点的时刻我们运行,但似乎矫枉过正,我们得到的大多数网站的流量。

有没有人用Django的网站框架运行Gunicorn,并可以给出一个提示如何配置?

+0

您是否在使用网站框架?你需要为你托管的每个站点创建settings.py吗? – 2010-09-21 08:25:59

+0

是的,我使用网站框架,每个网站都有一个'settings.py',它覆盖了应用程序的全局'settings.py'。目前,我正在通过其特定的'settings.py'与Gunicorn运行一个站点。 – 2010-09-21 13:58:25

+0

你重写的一种设置?也许你可以将它存储在也由网站框架管理的表格中? AFAIK gunicorn没有一种虚拟主机支持。也许尝试uwsgi? – 2010-09-21 17:33:02

回答

9

我有同样的问题,并在寻找相同的答案这个问题偶然发现。

我知道这个问题是旧的,你可能已经想通了现在,但由于它可能对别人有用的,这里是我如何解决它:

  • 你确实需要单独运行gunicorn进程使django网站框架工作,因为你只能在一个settings.py文件中指定gunicorn实例。如果你的网站没有获得很多流量,我只会在每个站点创建1个或2个gunicorn工作者。 (我知道,仍然可能矫枉过正)。

  • 理想情况下,你会想要的东西,如supervisord来管理这些不同的流程,使其更易于管理的出发/回采/重新启动不同的站点,但我无法得到它的工作。

首先,使用命令行在不同端口的本地主机上启动您的gunicorn服务器。例:

gunicorn_django -w 2 -b 127.0.0.1:1000 /path/to/my/django/project/site1_settings.py --daemon

gunicorn_django -w 2 -b 127.0.0.1: 1001 /path/to/my/django/project/site2_settings.py --daemon

你现在有在港口1000和1001上的本地主机上运行2个Django的网站(你可以使用任何端口套件你)。

现在您需要创建两个单独的nginx服务器配置文件,以将每个域名指向其各自的django站点。 例如:

server { 
    listen 80; 
    server_name website1.com; 
    client_max_body_size 4G; 

    keepalive_timeout 4; 

    location /media { 
     root /path/to/my/django/project/media; #this servers your static files 
    } 

    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://127.0.0.1:1000; #point to the django site already running on local host 
      break; 
     } 
    } 

    #add in any additional nginx configuration such as support for 500 errors or proxy apache to server php files etc. 
} 

然后创建您的第二个网站nginx的配置的重复,但更改服务器名称和proxy_pass的价值观站点2.

确保你的服务器配置文件包括在主要的nginx.conf文件中。

重新加载nginx,你应该很好去。

如果任何人有一个更容易/更好的方式去这个请发布。