使用gunicorn运行django应用程序有三种方法:
标准gunicorn
+ wsgi
(ref django doc)
gunicorn project.wsgi:application
使用gunicorn django集成(参考gunicorn doc和django doc):
python manage.py run_gunicorn
使用gunicorn_django
命令(ref gunicorn doc)
gunicorn_django [OPTIONS] [SETTINGS_PATH]
Django的文档建议使用1.,它甚至没有作为Gunicorn文档的选项列出。
有没有最好的方法来运行带有gunicorn的django应用程序,这些不同的解决方案有哪些可预见的优点/缺点?
瞥见gunicorn's code看起来他们几乎都做同样的事情:2。似乎是使用django的内部创建一个wsgi应用程序,而3.使用2.
如果是这样的话,我甚至不明白不仅仅使用“1”的原因是什么。所有的时间,尤其是自从django 1.4以来为wsgi.py
文件自动处理以来;如果这是真的,可能只是建议改进文档......
此外,使用django的gunicorn设置的最佳实践将是很好的。使用1.,在wsgi文件中设置一些默认值并避免其他设置是否有意义?
gunicorn -c configfile
并且configfile将指向django_settings到django wsgi.py
仅用于1。答案 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执行中更改任何其他内容