gunicorn 19.2 无法使用 18.0 配置启动

gunicorn 19.2 无法使用 18.0 配置启动

我有一个在 nginx 后面运行 gunicorn/Django 的开发服务器。作为更广泛的服务器环境更新的一部分,我尝试将 gunicorn 从 18.0 升级到 19.2.1,但该服务无法再启动。(该服务器正在运行 Arch,因此使用 systemctl。)

gunicorn 配置是由一个不再为我们服务的人完成的,而且我对 gunicorn 也不是很了解,我无法修复甚至定位问题,所以我恢复到了 18.0 版本,现在它可以正常工作了。但是,我最终想升级它,并使配置处于可以正常工作的状态。我感觉当前的配置不是最优的或多余的,但我无法确定 :-)。

环境(或 gunicorn 在其中运行的虚拟环境)没有任何变化,只有 gunicorn 本身进行了升级。Systemctl 产生了此错误systemctl start gunicorn

● gunicorn.service - gunicorn daemon (production)
   Loaded: loaded (/usr/lib/systemd/system/gunicorn.service; enabled)
   Active: failed (Result: resources) since Tue 2015-02-17 20:55:41 UTC; 8s ago
  Process: 2837 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
  Process: 9608 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 5353 ExecStart=/home/django/gunicorn/run.sh (code=exited, status=0/SUCCESS)
 Main PID: 24876 (code=exited, status=0/SUCCESS)

Feb 17 20:55:41 ashima systemd[1]: PID file /home/django/gunicorn/gunicorn.pid not readable (yet?) after start.
Feb 17 20:55:41 ashima systemd[1]: gunicorn.service never wrote its PID file. Failing.
Feb 17 20:55:41 ashima systemd[1]: Failed to start gunicorn daemon (production).
Feb 17 20:55:41 ashima systemd[1]: Unit gunicorn.service entered failed state.

尝试从 shell 手动运行 (粘贴在下面) 中包含的 gunicorn 命令run.sh,它立即退出,没有产生任何错误,退出代码为 0。没有记录任何内容。事实上,看起来我的前任在日志文件增长到惊人的大小后不久禁用了 gunicorn 日志记录,但这是另一天的问题。

相关文件的内容如下:

/usr/lib/systemd/system/gunicorn.service:

[Unit]
Description=gunicorn daemon

[Service]
Type=forking
PIDFile=/home/django/gunicorn/gunicorn.pid
User=django
WorkingDirectory=/home/django/[name_withheld]/project
ExecStart=/home/django/gunicorn/run.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=false

[Install]
WantedBy=multi-user.target

/home/django/gunicorn/run.sh:

#!/bin/bash

set -e

cd /home/django/[name_withheld]/project
source /home/django/.venv/bin/activate
exec gunicorn -p /home/django/gunicorn/gunicorn.pid -c /home/django/gunicorn/config.py -e HTTPS=on [name_withheld]_site.wsgi:application

/home/django/gunicorn/config.py:

bind = 'unix:/tmp/gunicorn.sock'
backlog = 2048
workers = 16
worker_class = 'egg:gunicorn#sync'
worker_connections = 1000
timeout = 30
keepalive = 2
debug = False
spew = False
daemon = True
pidfile = None
umask = 0755
user = None
group = None
tmp_upload_dir = None
raw_env = 'HTTPS=on'
errorlog = '-'
loglevel = 'info'
accesslog = None
proc_name = None

def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")

答案1

(在针对这个问题发表的评论中,我必须特别指出斯卡拉普因为它帮助我自己找到了解决方案,让 gunicorn 正确地输出错误。我希望我能为此授予部分赏金;将该评论转换为答案还不是一个完整的答案,但它确实有很大帮助。)

事实证明这是配置文件中有问题的行:

worker_class = 'egg:gunicorn#sync'

它导致了这个错误:

Error: class uri 'egg:gunicorn#sync' invalid or not found: 

[Traceback (most recent call last):
  File "/home/django/.venv/lib/python2.7/site-packages/gunicorn/util.py", line 113, in load_class
    return pkg_resources.load_entry_point(dist, section, name)
  File "/home/django/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 318, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/django/.venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 2220, in load_entry_point
    raise ImportError("Entry point %r not found" % ((group,name),))
ImportError: Entry point ('gunicorn.workers', 'sync') not found
]

用 替换它worker_class = 'sync'解决了 ImportError 问题。在 18.0 -> 19.2.1 升级中无需进行其他配置更改。

gunicorn 的文档似乎有问题,我打算报告这个问题,因为在写这篇文章的时候,v19.2.1 的文档仍然说明egg:gunicorn#[worker]语法是有效的。(那里的例子使用了 gevent,但它看起来应该适用于其他类型)。谁知道呢,它可能在某些情况下有效,但在我的环境中(虚拟环境中的 gunicorn,使用 pip 安装),它无效。

相关内容