使用Heroku/gunicorn/django配置部署时出现问题

10

我想在Heroku上运行我的Django应用程序。

文件夹结构:


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

Procfile

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放置它的project / project内部?你应该展示该文件的内容。 - Daniel Roseman
我把wsgi.py移动到了项目的主文件夹,你认为这是问题所在吗? - Avi Meir
这里有太多我们不知道的东西。作为你的DJANGO_SETTINGS_MODULE,“config”是什么?你真的把你的设置文件命名为config.py而不是settings.py吗?它是否在与wsgi.py相同的目录中? - Daniel Roseman
我正在使用pydanny的cookiecutter项目模板,如此处所示:https://github.com/pydanny/cookiecutter-django。settings.py文件位于名为config的自己的文件夹中,并且命名为common.py用于基本设置,然后在本地或生产环境中使用local.py或production.py。 - Avi Meir
5个回答

5
--preload添加到Procfile中的gunicorn命令会使您的Traceback更易读并显示实际错误。

示例:

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

3
我有过类似的问题,在阅读了gunicorn的文档后,我成功添加了相关内容。
--log-level debug

在Web上运行:gunicorn project.wsgi:application --log-file -

使其可以

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

在我的情况下,路径也是一个问题。

2

最终找到了解决方案,原来是django-organizations缺少了一个依赖项。我发现在heroku上没有办法(至少我找不到)看到任何有用的错误输出,这让我感到很疑惑。最终我解决了问题。

heroku run bash --app <app_name>

然后逐行运行wsgi.py文件,最终在

处得到了一些有意义的错误提示。
from configurations.wsgi import get_wsgi_application  # noqa

很明显这是一个缺少模块的错误,安装上它后一切都运行得非常完美。


非常感谢!我正在使用 Flask,我忘记在 requirements.txt 文件中添加其中一个依赖项。不知道为什么它会给出这种神秘的错误消息,而不是通常的“找不到模块”。 - KetZoomer

1
将您的Procfile更改为:
web:gunicorn project.wsgi:application --log-file = -
在Python路径中缺少wsgi.py文件的project模块。

我做到了,它找不到我的配置文件,所以我将这一行改为: gunicorn project.wsgi:application --pythonpath="$PWD/project" --log-file -
仍然收到 gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3> 的错误信息。
- Avi Meir
为什么要指定pythonpath?在Heroku的文档中似乎没有要求这样做。 - schillingt

0

我解决了。我按照以下步骤操作: 删除所有未使用的库。 删除 requirements.txt 文件。 创建一个新的 requirements.txt 文件。 提交到 Git,然后在 Heroku 上部署。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接