2010-09-21 76 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,你應該很好去。

如果任何人有一個更容易/更好的方式去這個請發佈。