Я занимаюсь несколько болезненной миграцией наших промежуточных и производственных серверов с Ubuntu 12.04 на 16.04. Я тестирую миграцию на промежуточном этапе, и она в основном работает, за исключением запуска uWSGI под systemd (ранее он отлично работал под Upstart). Это работает без проблем:
uwsgi --ini /etc/uwsgi/my_wsgi.ini
Но выполнение следующего не работает (uWSGI не запускается, но не выдает ошибку):
sudo systemctl start uwsgi
Я создал следующий сервис в /etc/systemd/system/uwsgi.service:
[Unit]
Description=uWSGI Service
[Service]
ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi/my_wsgi.ini
Restart=always
RestartSec=5
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target
а my_wsgi.ini содержит следующее:
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /path/to/project/hidden
# Django's wsgi file
module = wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 8
# the socket (use the full path to be safe)
socket = /path/to/socket/hidden
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
# Mercilessly kill this worker if it takes longer than this time to reload
reload-mercy = 8
# Reload workers after the specified amount of managed requests (avoid memory leaks)
max-requests = 5000
# Every request that will take longer than the seconds specified in the harakiri timeout will be dropped and the corresponding worker is thereafter recycled.
harakiri = 90
# Log everything and make daemon
daemonize = /var/log/uwsgi/my.log
# use custom settings file
env = DJANGO_SETTINGS_MODULE=settings.staging
# set pid file for starting/stopping server
pidfile = /path/to/pid/hidden.pid
# See https://docs.newrelic.com/docs/python/python-agent-and-uwsgi
enable-threads = true
single-interpreter = true
Бег systemd-analyze verify uwsgi.service
ничего не возвращает и sudo journalctl
возвращает следующее:
Starting uWSGI Service...
[uWSGI] getting INI configuration from /etc/uwsgi/my_wsgi.ini
Started uWSGI Service.
uwsgi.service: Service hold-off time over, scheduling restart.
Stopped uWSGI Service.
... (repeats a few times) ....
Я подозреваю что uwsgi.service: Service hold-off time over, scheduling restart.
может указывать на проблему, но я не смог ее понять.
В документация uwsgi четко заявляет:
ПРИМЕЧАНИЕ: НЕ демонизируйте Императора (или мастера), если вы не знаете, что делаете !!!
К сожалению, вы демонизировали Императора, не зная, что делаете. Из вашего вопроса:
# Log everything and make daemon daemonize = /var/log/uwsgi/my.log
Проблема в том, что uwsgi поддерживает systemd, а модуль systemd сообщает systemd, что uwsgi уведомит systemd, когда uwsgi готов начать обработку запросов. По умолчанию uwsgi запускается в этом режиме в системе systemd, если только вы говорите ему демонизировать. В этом случае uwsgi не поговорите с systemd. Вот почему systemd немного подождал и, наконец, отказался от ожидания, пока uwsgi сообщит systemd, что он готов.
Вместо того, чтобы демонстрировать uwsgi и регистрироваться непосредственно в файле, в документации предлагается разрешить ему регистрировать стандартную ошибку по умолчанию и позволить systemd собирать журналы и регистрировать их. Вы захотите сделать это, если в конечном итоге вам придется отправлять журнал в другое место, например, в стек ELK. Например:
[Service]
StandardError=syslog
Или вы можете войти прямо из uwsgi без демонизации.
logto = /var/log/uwsgi/my.log