用Gunicorn运行Django - 最佳实践

时间:2013-05-31 13:03:19

标签: django gunicorn

使用gunicorn运行django应用程序有三种方法:

  1. 标准gunicorn + wsgiref django doc

    gunicorn project.wsgi:application

  2. 使用gunicorn django集成(参考gunicorn docdjango doc):

    python manage.py run_gunicorn

  3. 使用gunicorn_django命令(ref gunicorn doc

    gunicorn_django [OPTIONS] [SETTINGS_PATH]

  4. Django的文档建议使用1.,它甚至没有作为Gunicorn文档的选项列出。

    有没有最好的方法来运行带有gunicorn的django应用程序,这些不同的解决方案有哪些可预见的优点/缺点?

    瞥见gunicorn's code看起来他们几乎都做同样的事情:2。似乎是使用django的内部创建一个wsgi应用程序,而3.使用2.

    如果是这样的话,我甚至不明白不仅仅使用“1”的原因是什么。所有的时间,尤其是自从django 1.4以来为wsgi.py文件自动处理以来;如果这是真的,可能只是建议改进文档......

    此外,使用django的gunicorn设置的最佳实践将是很好的。使用1.,在wsgi文件中设置一些默认值并避免其他设置是否有意义?

    参考文献:

    1. Should I use django-gunicorn integration or wsgi?仅涉及选择1.和3.,没有提示设置,答案没有理由
    2. Deploying Django with gunicorn and nginx提供更广泛的信息,但不是严格相关的,也不是回答这个问题
    3. Django Gunicorn wsgi关于版本“4”,即启动gunicorn -c configfile并且configfile将指向django_settings到django
    4. Django WSGI and Gunicorn只是有点混乱:)混合1.和3.当然wsgi.py仅用于1。

3 个答案:

答案 0 :(得分:32)

退房后我说最好的方法是使用gunicorn + wsgi

$ gunicorn project.wsgi:application

现在它们都在gunicorn docs中得到证实:if you run Django 1.4 or newer, it’s highly recommended to simply run your application with the WSGI interface using the gunicorn command和django as linked above

它还避免添加gunicorn作为已安装的应用程序,这意味着不需要安装gunicorn来测试您的应用程序,这可能会不时有用。

关于设置

要使用的Django设置文件可以通过ENV变量传递,也可以在wsgi.py文件中自定义。如果我有多个设置(例如,多个网站)必须从同一个项目运行,我有时会创建几个wsgi.py文件 - See Django Doc以获取更多信息。

单线解决方案,不需要Carl's comment中的任何新文件:

DJANGO_SETTINGS_MODULE=project.settings.prod gunicorn project.wsgi:application

听起来像是一种更好的方式(虽然我可能最终会在一些shell命令中编写它以使其易于“记住"”。

Gunicorn设置可以作为-c settings_file传递,但我正在探索其他方式,如果找到任何方法,我会尝试更新此答案。使用环境变量似乎是一个可行的方法,但仅适用于有限的情况

特别是在django和gunicorn之间获得/分享一些设置会很好; gunicorn文件说:

  

目前,只有Paster应用程序可以访问框架   具体设置。如果您有为WSGI提供设置的想法   应用程序或从Django的settings.py中获取信息   免费提出问题让我们知道。

更新:找不到任何更聪明的方法,但所有env变量对于我最常见的情况都足够了。)

答案 1 :(得分:2)

我想使用run_gunicorn是可行的方法,它也是使用它的最简单方法。

它与usign gunicorn project.wsgi:application基本相同,但需要将gunicorn添加到INSTALLED_APPS,以便django识别run_gunicorn命令,因此它可能不是默认方式...

使用gunicorn_django或多或少已弃用,因为文档还说明here ...

答案 2 :(得分:0)

找到适用于manage.py(在本地计算机上)和gunicorn

的解决方案

创建一个包含所有传统内容的文件

# mysite/settings/set_env.py

import os

_environment = os.getenv('environment', None)
if _environment == "production":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.production")
elif _environment == "development":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.development")
else:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")

并在manage.py和wsgi.py文件中导入此文件,无需在gunicorn执行中更改任何其他内容