【问题标题】:Running Multiple Sites with Django's Sites Framework through Gunicorn/Nginx通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点
【发布时间】:2011-04-14 23:46:11
【问题描述】:

我有一个基于 Django 的 CMS,它使用 Django 的站点框架和 Nginx/Apache/mod_wsgi 虚拟主机在不同域上运行多个网站。我们正在评估 Django 堆栈的其他选项,并让 CMS 在具有 Nginx 代理到 Gunicorn(特别是 gunicorn_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 并且可以提示它是如何配置的?

【问题讨论】:

  • 您是否使用站点框架?您是否必须为您托管的每个站点创建一个 settings.py?
  • 是的,我正在使用站点框架,每个站点都有一个 settings.py 覆盖应用程序的全局 settings.py。目前,我正在使用 Gunicorn 从其特定的 settings.py 运行一个站点。
  • 您会覆盖哪种设置?也许您可以将其存储在也使用站点框架管理的表中? AFAIK gunicorn 没有虚拟主机支持。也许试试 uwsgi?
  • 我们覆盖了各种设置,主要是网站的 ID,但有时也INSTALLED_APPS 添加自定义模块。我认为你是对的,uWSGI 可能是我更好的选择。今天早上我简要地研究了一下,虚拟主机的东西看起来像我想要的。干杯。

标签: django apache nginx


【解决方案1】:

我遇到了同样的问题,偶然发现了这个问题以寻找相同的答案。

我知道这个问题很老了,你现在可能已经想通了,但是因为它可能对其他人有用,所以我是这样解决的:

  • 您确实需要运行单独的 gunicorn 进程以使 django 站点框架工作,因为您只能将 gunicorn 实例指向一个 settings.py 文件。如果您的网站没有太多流量,我只会为每个网站创建 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

您现在有 2 个 django 站点在 localhost 上运行,端口为 1000 和 1001(您可以使用任何适合您的端口)。

现在您需要创建两个单独的 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,你应该很高兴。

如果有人有更简单/更好的方法来解决这个问题,请发布。

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2012-09-15
    • 1970-01-01
    • 2012-05-06
    • 2011-06-24
    相关资源
    最近更新 更多