gunicorn 19.2 не запускается с конфигурацией 18.0
У меня есть dev-сервер, на котором запущен gunicorn/Django за nginx. В рамках более широкого обновления серверной среды я попытался обновить gunicorn с 18.0 до 19.2.1, но служба больше не запускалась. (Сервер работает под Arch и поэтому использует systemctl.)
Конфигурирование gunicorn было выполнено кем-то, кто больше не находится в нашем распоряжении, и не очень хорошо знал gunicorn, я не смог исправить или даже обнаружить проблему, поэтому я вернулся к версии 18.0, и она работает на данный момент. Тем не менее, я хотел бы обновить его в конечном итоге и получить конфигурацию в форме, где она будет работать. У меня такое ощущение, что текущий конфиг неоптимальный или избыточный, но я точно не знаю:-).
Ничто не изменилось в окружающей среде (или в virtualenv, в котором работает 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.
Попытка выполнить команду 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 ответ
(Из комментариев, опубликованных к этому вопросу, я должен особенно упомянуть один по skarap, так как он помог мне найти решение самостоятельно, заставив огнестрельное оружие правильно выводить ошибки. Я хотел бы назначить частичную награду за это; конверсия этого комментария в ответ еще не было бы полным ответом, но это помогло существенно.)
Оказывается, это была проблемная строка в файле конфигурации:
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 в virtualenv, установленном с pip), это не так.