37

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

  1. 标准gunicorn+ wsgi参考 django 文档

    gunicorn project.wsgi:application

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

    python manage.py run_gunicorn

  3. 使用gunicorn_django命令(参考gunicorn doc

    gunicorn_django [OPTIONS] [SETTINGS_PATH]

Django 的文档建议使用 1.,它甚至没有被列为 Gunicorn 文档中的一个选项。

关于使用 gunicorn 运行 django 应用程序的最佳方式是否有任何最佳实践,这些不同解决方案的可预见的优点/缺点是什么?

看一眼gunicorn 的代码,看起来他们几乎都在做同样的事情:2. 似乎正在使用 django 的内部创建一个 wsgi 应用程序,3. 使用 2.

如果是这样的话,我什至不明白为什么不简单地使用“1”。一直以来,特别是因为wsgi.py自 django 1.4 以来为您自动创建了一个文件;如果这是真的,也许应该建议对文档进行改进......

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

参考:

  1. 我应该使用 django-gunicorn 集成还是 wsgi?仅涉及选择 1. 和 3.,没有设置提示,答案没有给出任何理由
  2. 使用 gunicorn 和 nginx 部署 Django提供了一些更广泛的信息,但没有严格相关,也没有回答这个问题
  3. Django Gunicorn wsgi关于版本“4”,它正在启动gunicorn -c configfile并且配置文件将指向 django_settings 到 django
  4. Django WSGI 和 Gunicorn只是有点令人困惑 :) 将 1. 和 3 混合在一起。当然wsgi.py只与 1 一起使用。
4

3 回答 3

41

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

$ gunicorn project.wsgi:application

这两者现在都在 gunicorn 文档中得到确认:如果您运行 Django 1.4 或更高版本,强烈建议您使用上面链接的 gunicorn 命令和 django使用 WSGI 接口简单地运行您的应用程序。

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

关于设置

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

一种不需要Carl 评论中的任何新文件的单线解决方案:

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

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

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

特别是在 django 和 gunicorn 之间获取/共享一些设置会很好;gunicorn 文档说:

目前,只有 Paster 应用程序可以访问特定于框架的设置。如果您对为 WSGI 应用程序提供设置或从 Django 的 settings.py 中提取信息有任何想法,请随时打开一个问题让我们知道。

更新:还没有找到任何更聪明的方法,但毕竟 env 变量对于我最常见的情况来说已经足够了)。

于 2013-06-04T16:51:01.467 回答
3

我猜使用run_gunicorn是要走的路,也是最简单的使用方法。

和usign基本一样gunicorn project.wsgi:application但需要添加gunicornINSTALLED_APPS以便django识别run_gunicorn命令,因此它可能不是默认方式......

使用gunicorn_django或多或少已被弃用,因为这里的文档也说明......

于 2013-05-31T14:16:36.970 回答
0

找到了一个适用于 manage.py (在本地机器上)和 gunicorn 的解决方案

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

# 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 执行中更改任何其他内容

于 2018-01-17T17:59:30.193 回答