我有一个基于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并且可以提示它是如何配置的?
答案 0 :(得分:10)
我遇到了同样的问题,偶然发现了这个问题以寻找相同的答案。
我知道问题已经过时了,你现在可能已经弄明白了,但是因为它可能对别人有用,所以我就是这样解决的:
您需要运行单独的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
您现在有两个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,你应该好好去。
如果有人有更简单/更好的方法,请发布。