通过 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