通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点

Posted

技术标签:

【中文标题】通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点【英文标题】:Running Multiple Sites with Django's Sites Framework through Gunicorn/Nginx 【发布时间】: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 可能是我更好的选择。今天早上我简要地研究了一下,虚拟主机的东西看起来像我想要的。干杯。 【参考方案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,你应该很高兴。

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

【讨论】:

以上是关于通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点的主要内容,如果未能解决你的问题,请参考以下文章

UnicodeEncodeError [Python3/Gunicorn/Nginx/Django]

Python3+Gunicorn+Nginx 部署Flask项目

使用 Gunicorn + Nginx + Flask 有啥好处? [复制]

使用 flask_socketio + flask + gunicorn + nginx 获得 502 bad gateway 和 400 bad request

对文件进行更改时重新启动 Gunicorn/Nginx

部署flask+gunicorn+nginx 项目