我有一个在 virtualenv 中运行的相当简单的 Django 站点。 当我使用 ./manage.py runserver 时它运行良好,但是当我尝试使用 gunicorn 运行它时,我得到一个 Worker failed to boot 错误,没有进一步的解释。
tijs<strong i="6">@python</strong>:~/projects/hoogtij.net$ sudo ./runscript.sh
2012-04-25 14:02:08 [12681] [INFO] Starting gunicorn 0.14.1
2012-04-25 14:02:08 [12681] [INFO] Listening at: http://127.0.0.1:8001 (12681)
2012-04-25 14:02:08 [12681] [INFO] Using worker: sync
2012-04-25 14:02:08 [12696] [INFO] Booting worker with pid: 12696
2012-04-25 14:02:08 [12697] [INFO] Booting worker with pid: 12697
2012-04-25 14:02:08 [12698] [INFO] Booting worker with pid: 12698
Traceback (most recent call last):
File "/home/tijs/.virtualenvs/hoogtij/bin/gunicorn_django", line 8, in <module>
load_entry_point('gunicorn==0.14.1', 'console_scripts', 'gunicorn_django')()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/app/djangoapp.py", line 129, in run
DjangoApplication("%prog [OPTIONS] [SETTINGS_PATH]").run()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 129, in run
Arbiter(self).run()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 184, in run
self.halt(reason=inst.reason, exit_status=inst.exit_status)
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 279, in halt
self.stop()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 327, in stop
self.reap_workers()
File "/home/tijs/.virtualenvs/hoogtij/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 413, in reap_workers
raise HaltServer(reason, self.WORKER_BOOT_ERROR)
gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
我应该去哪里解决这个问题?
gunicorn 是安装在 virtualenv 内部还是外部?
里面。 到目前为止,我认为这是一个应用程序问题,因为当我丢弃大部分设置时,gunicorn 会启动,只是在查看该输出时您无法判断出什么问题。
尝试使用“--debug --log-level debug”。 看看你是否得到更多信息。
恐怕这是带有调试日志级别的输出
:失望的:
我不确定发生了什么。 在“引导工作人员”消息之后,如果出现问题,我希望看到“工作进程中的异常”。 刚刚过了午夜,但我会继续睡,也许能想出点什么。
谢谢老兄,如果我自己弄明白了,我会告诉你的。 我现在正在通过 settings.py 打开东西,直到我再次遇到错误。 老派调试:)
@benoitc为什么log.exception
不起作用?
我通常不喜欢使用那个,因为如果有意义的话,这只是 Python 的东西。
调试声音在那里更合适。 真正的补充是回溯:)
实际上我有一个类似的问题,我认为这与日志文件的写权限有关。 如果我使日志文件(stderr 和 stdout)可公开写入,它似乎工作正常。 所以我想这让我想到了当你第一次从 supervisord 启动 gunicorn 时,日志文件是在 gunicorn 接管之前在 root 下创建的。 管理确保日志文件由 gunicorn 创建而不是由 supervisord 创建的最佳方法是什么?
你如何发射 gunicorn? 你用最后一个头复制它吗?
我用supervisord启动它。 这是我用于 supervisord 的 gunicorn 配置:
[程序:sliceweb]
目录 = /opt/src/slicephone/webapp/webapp/
命令 = /opt/src/slicephone/webapp/scripts/gunicorn.sh
stdout_logfile = /opt/logs/supervisord.stdout.log
stderr_logfile = /opt/logs/supervisord.stderr.log
和实际的 gunicorn 脚本(注意我是如何将日志文件触摸和 chown 给 gunicorn 用户/组的):
设置 -e
DATASTORE_SOFTWARE="XXXXX"
ACCESS_LOGFILE=/opt/logs/gunicorn.slice.access.log
ERROR_LOGFILE=/opt/logs/gunicorn.slice.error.log
LOGFILE=/opt/logs/gunicorn.slice.log
LOGDIR=$(目录名 $LOGFILE)
WEBAPPDIR=$(目录名$0)/../
NUM_WORKERS=3
DEBUG_FLAGS="--debug --log-level debug"
用户=www-数据
GROUP=www-数据
cd $WEBAPPDIR/webapp
测试 -d $LOGDIR || mkdir -p $LOGDIR
回声 WebAppDir:$WEBAPPDIR
回声“用户:$ USER”
回声“组:$ GROUP”
触摸 $ACCESS_LOGFILE $ERROR_LOGFILE $LOGFILE
chown -R $USER:$GROUP $ACCESS_LOGFILE $ERROR_LOGFILE $LOGFILE
导出 DATASTORE_SOFTWARE=$DATASTORE_SOFTWARE ; exec /opt/virtenvs/django_slice/bin/gunicorn_django $DEBUG_FLAGS -w $NUM_WORKERS --user=$USER --group=$GROUP --log-level=debug --log-file=$LOGFILE --access-logfile= $ACCESS_LOGFILE --error-logfile=$ERROR_LOGFILE
关于最新头像的好问题。 pip freeze 显示它是 0.14.1(.2 是最新的不是吗?)
你解决问题了吗? 我有同样的问题,目前我不知道如何解决这个问题。
应该可以解决的。 你运行的是哪个版本的 gunicorn? 您能否提供有关您的配置的更多信息,以便我可以重现它? 谢谢。
@panyam你试过 0.14.3 吗?
@benoitc抱歉,我没有在 0.14.3 上尝试过。 我设法通过让 gunicorn 用户在 supervisord 启动脚本后立即成为日志文件的所有者来使其在 0.14.1 上运行。
只是为了澄清我不认为这是一个gunicorn问题。 @anyeguyue - 检查这个的最佳位置是查看 supervisord 日志或 gunicorn 日志(通常在 /var/log/gunicorn/....),看看那里是否有“权限被拒绝”错误。
我刚刚遇到了同样的问题,首先通过导致错误的“python manage.py syncdb”解决了。 修复该设置问题后,gunicorn 工作(重新启动 nginx 后)。
我也解决了这个问题,但方式不同。 gunicorn_django文件的第一行是“#!/opt/django/env/mysite/bin/python”,是我的虚拟环境python路径。 将其替换为“#!/usr/bin/env python”解决了问题,虽然他们都使用了相同的python解释器,但是有一些PYTHONPATH差异,这就是之前失败的原因。
@anyeguyue我在 gunicorn 0.14.5 和 Django 1.4 上遇到了同样的问题,但症状更糟: gunicorn_django -b 0.0.0.0:8000
拒绝运行。 您的修复有效,并且非常明显:您应该始终询问/usr/bin/env
哪个python
! 谢谢。
@asimihsan,乐于助人
我也有这个问题。 结果发现我的代码中存在错误导入的问题。 如果您想调试,请尝试运行 gunicorn_django --preload - 这有望吐出正确的异常。
对于任何面临同样问题的人来说,问题通常出在 django 本身。
激活你的 venv 并运行 ./manage.py runserver
这通常会为您提供更详细的错误消息。
:+1: @fergalmoran帮我解决了我的问题(这是 PIL 的问题)
我也遇到了同样的问题。。。不知道怎么解决
@pythdasch这里讨论了几个不同的问题。 如果您可以提供更多信息,请打开一个新票证,或者简单地向邮件列表发送消息,其他人可能会帮助您调试。
我想我们在#gunicorn 上解决了@pythdasch的问题。 @pythdasch ,你能确认一下吗?
我确认,感谢 berker :)
我的 wsgi 与我的 manage.py 位于同一文件夹中,因此我必须放置路径wsgi:application而不是 project。 wsgi:应用程序
(这是 wsgi 的错误路径。在这种情况下需要是 wsgi:application 而不是 project.wsgi:application)
@tilgovi是的,对不起,我去了 irc 频道 gunicorn 来解决它:)
我昨天遇到了同样的问题,gunicorn 0.18 和以下调用:
gunicorn 'app:create_app()' --name X --workers 5 --user=apprunner --group=apprunner --bind='0.0.0.0:5000' --log-config=resource/config/di/logging.conf --timeout=360 --debug --log-level debug
这是由于我的 Flask 应用程序中的导入错误。 这里的要点是,如果工作程序在启动时崩溃,gunicorn 不会显示来自应用程序的回溯,因此我必须手动启动 Flask 应用程序以查看实际问题。
我想知道我们是否可以让它显示实际的回溯
这将是非常好的。 IMO,下一个最好的事情是,如果无法显示原始回溯,将包含一条建议直接运行应用程序的消息,而不是使用 gunicorn,以查找实际错误。
如果我正确理解了问题,Gunicorn 已经显示了诸如 ImportError 之类的异常消息:
$ gunicorn a:app --error-logfile=- --access-logfile=-
[2014-12-10 17:13:31 +0000] [12176] [INFO] Starting gunicorn 19.2.0
[2014-12-10 17:13:31 +0000] [12176] [INFO] Listening at: http://127.0.0.1:8000 (12176)
[2014-12-10 17:13:31 +0000] [12176] [INFO] Using worker: sync
[2014-12-10 17:13:31 +0000] [12181] [INFO] Booting worker with pid: 12181
[2014-12-10 17:13:31 +0000] [12181] [ERROR] Exception in worker process:
Traceback (most recent call last):
File "/home/berker/projects/gunicorn/gunicorn/arbiter.py", line 517, in spawn_worker
worker.init_process()
File "/home/berker/projects/gunicorn/gunicorn/workers/base.py", line 117, in init_process
self.wsgi = self.app.wsgi()
File "/home/berker/projects/gunicorn/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/berker/projects/gunicorn/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/home/berker/projects/gunicorn/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/berker/projects/gunicorn/gunicorn/util.py", line 355, in import_app
__import__(module)
File "/home/berker/projects/testdjango/a.py", line 1, in <module>
from flask import Flask
ImportError: No module named flask
和其他类型的错误消息:
$ gunicorn a:app --error-logfile=- --access-logfile=-
[2014-12-10 17:18:52 +0000] [12294] [INFO] Starting gunicorn 19.2.0
[2014-12-10 17:18:52 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:52 +0000] [12294] [ERROR] Retrying in 1 second.
[2014-12-10 17:18:53 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:53 +0000] [12294] [ERROR] Retrying in 1 second.
[2014-12-10 17:18:54 +0000] [12294] [ERROR] Connection in use: ('127.0.0.1', 8000)
[2014-12-10 17:18:54 +0000] [12294] [ERROR] Retrying in 1 second.
当我尝试像这样运行应用程序时,我遇到了同样的问题:
gunicorn app:application -b localhost:3000
问题是除了文件app.py
之外,还存在一个名为app
的目录。 它在重命名 python 文件后工作。
@brouberol我现在也遇到了同样的问题。 当 Flask 应用程序有一些导致导入错误的模块时,Gunicorn 不会记录回溯,但 Flask 的内置服务器可以。
我们可以做的是,如果 Gunicorn 无法在任何错误日志中没有更具体的信息的情况下启动 worker,首先尝试 Flask 的内置服务器。
用 --preload 运行 guncorn 可以看到错误日志
对我来说,Django runserver
工作得很好。 问题是在gunicorn.conf.py
文件中导入 Django settings
。 删除该导入解决了问题。
最有用的评论
对于任何面临同样问题的人来说,问题通常出在 django 本身。
激活你的 venv 并运行 ./manage.py runserver
这通常会为您提供更详细的错误消息。