Django中配置Gunicorn

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中配置Gunicorn相关的知识,希望对你有一定的参考价值。

参考技术A Gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,移植至Ruby的独角兽(Unicorn)项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。

Django自带的简易服务器,它是一个纯Python写的轻量级的WEB服务器,但它是为了开发而设计的,不适合在生产环境中部署。

在Django中配置gunicorn,适合高并发的生产环境。

在settings.py添加gunicorn。

其中access_log_format选项的变量含义如下:

accesslog、errorlog日志文件可以写到文件,也可以标准输出到屏幕。

以gunicorn.conf.py配置文件启动gunicorn

也可以直接启动

or

Dockerfile文件

输出:

使用 Heroku/gunicorn/django 配置部署的问题

【中文标题】使用 Heroku/gunicorn/django 配置部署的问题【英文标题】:Problems configuring deployment with Heroku/gunicorn/django 【发布时间】:2015-04-17 05:03:29 【问题描述】:

我正在尝试在 heroku 上运行我的 django 应用程序。

文件夹结构:

app/
  Procfile
  docs/
  ...
  project/
    manage.py
    wsgi.py
    <django apps>

过程文件

web: gunicorn --pythonpath="$PWD/project" wsgi:application --log-file=-

我得到的错误:

2015-02-16T16:05:00.646316+00:00 heroku[web.1]: Starting process with command `gunicorn --pythonpath="$PWD/project" wsgi:application --log-file=-`
2015-02-16T16:05:02.697633+00:00 app[web.1]: [2015-02-16 16:05:02 +0000] [3] [INFO] Listening at: http://0.0.0.0:44846 (3)
2015-02-16T16:05:02.709567+00:00 app[web.1]: [2015-02-16 16:05:02 +0000] [9] [INFO] Booting worker with pid: 9
2015-02-16T16:05:02.696968+00:00 app[web.1]: [2015-02-16 16:05:02 +0000] [3] [INFO] Starting gunicorn 19.1.1
2015-02-16T16:05:02.697790+00:00 app[web.1]: [2015-02-16 16:05:02 +0000] [3] [INFO] Using worker: sync
2015-02-16T16:05:02.793753+00:00 app[web.1]: [2015-02-16 16:05:02 +0000] [10] [INFO] Booting worker with pid: 10
2015-02-16T16:05:03.157305+00:00 app[web.1]: Traceback (most recent call last):
2015-02-16T16:05:03.157311+00:00 app[web.1]:   File "/app/.heroku/python/bin/gunicorn", line 11, in <module>
2015-02-16T16:05:03.157351+00:00 app[web.1]:     sys.exit(run())
2015-02-16T16:05:03.157383+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 74, in run
2015-02-16T16:05:03.157461+00:00 app[web.1]:     WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
2015-02-16T16:05:03.157463+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/app/base.py", line 185, in run
2015-02-16T16:05:03.157506+00:00 app[web.1]:     super(Application, self).run()
2015-02-16T16:05:03.157527+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/app/base.py", line 71, in run
2015-02-16T16:05:03.157604+00:00 app[web.1]:     Arbiter(self).run()
2015-02-16T16:05:03.157607+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 196, in run
2015-02-16T16:05:03.157635+00:00 app[web.1]:     self.halt(reason=inst.reason, exit_status=inst.exit_status)
2015-02-16T16:05:03.157656+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 292, in halt
2015-02-16T16:05:03.157730+00:00 app[web.1]:     self.stop()
2015-02-16T16:05:03.157744+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 343, in stop
2015-02-16T16:05:03.157814+00:00 app[web.1]:     time.sleep(0.1)
2015-02-16T16:05:03.157836+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 209, in handle_chld
2015-02-16T16:05:03.157887+00:00 app[web.1]:     self.reap_workers()
2015-02-16T16:05:03.157908+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/arbiter.py", line 459, in reap_workers
2015-02-16T16:05:03.158009+00:00 app[web.1]:     raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2015-02-16T16:05:03.158075+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2015-02-16T16:05:03.904714+00:00 heroku[web.1]: Process exited with status 1
2015-02-16T16:05:03.914410+00:00 heroku[web.1]: State changed from starting to crashed

更新 1 我的 wsgi.py 文件

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config")
os.environ.setdefault("DJANGO_CONFIGURATION", "Production")

from configurations.wsgi import get_wsgi_application
application = get_wsgi_application()

这里我只是添加一些文本,因为 SO 有这个愚蠢的最小数量的文本必须写在一个问题中。我的意思是,我确实知道需要保持质量,但如果问题是不言自明的,为什么还要强迫人们写不需要的文本呢?谢谢,祝您有美好的一天!

【问题讨论】:

你的 WSGI 文件是如何到达那里的,而不是在 Django 放置它的项目/项目中?您应该显示该文件的内容。 我把 wsgi.py 移到了项目主文件夹,你觉得是这个问题吗? 这里有太多我们不知道的地方。什么是“配置”作为您的 DJANGO_SETTINGS_MODULE?你真的把你的设置文件叫做 config.py 而不是 settings.py 吗?和wsgi.py在同一个目录吗? 我正在使用 pydanny 的 cookiecutter 项目模板,如下所示:github.com/pydanny/cookiecutter-django settings.py 文件位于它们自己的名为 config 的文件夹中,其名称为 common.py 用于基本设置,然后local.py 或 production.py 用于语言环境或生产环境 【参考方案1】:

--preload 添加到 Procfile 中的 gunicorn 命令将使您的 Traceback 更具可读性并显示实际错误。

示例:

gunicorn project.wsgi:application --preload --workers 1

【讨论】:

【参考方案2】:

我也有类似的问题,看了他docs的gunicorn后,我可以添加

--log-level debug

web: gunicorn project.wsgi:application --log-file -

这样的

web: gunicorn project.wsgi:application --log-file - --log-level debug

就我而言,路径也是一个问题。

【讨论】:

【参考方案3】:

终于找到了解决办法,原来是django-organizations缺少依赖。我发现没有办法(至少我找不到)看到heroku的任何有用的错误输出,这很疯狂。我终于做到了

heroku run bash --app <app_name>

然后逐行运行wsgi.py文件,最后得到一些有意义的错误

from configurations.wsgi import get_wsgi_application  # noqa

然后很明显这是缺少模块错误,安装它并且一切运行正常。

【讨论】:

非常感谢!我正在使用烧瓶,但忘记在 requirements.txt 文件中放入其中一项要求。不知道为什么它给出了这个神秘的错误消息,而不是通常的“找不到模块”【参考方案4】:

将您的 Procfile 更改为:

web: gunicorn project.wsgi:application --log-file=-

您在 wsgi.py 文件的 python 路径中缺少 project 模块。

【讨论】:

我做到了,它没有找到我的配置文件,所以将行更改为: gunicorn project.wsgi:application --pythonpath="$PWD/project" --log-file - 仍然得到gunicorn.errors.HaltServer: 为什么要指定pythonpath。它看起来不像 Heroku 的文档中所要求的。

以上是关于Django中配置Gunicorn的主要内容,如果未能解决你的问题,请参考以下文章

Django中配置Gunicorn

如何在 Django 和 Celery 中配置多个代理?

django缓存优化中caches参数如何配置?

Django日志配置

Django配置管理settings文件配置

Django中Logging日志配置