uWSGI não inicia com o systemd no Ubuntu 16.04

5

Estou no processo de fazer uma migração dolorosa de nossos servidores de teste e produção do Ubuntu 12.04 para 16.04. Eu estou testando a migração no staging e está trabalhando principalmente, exceto para fazer o uWSGI iniciar no systemd (ele funcionou bem no Upstart). Isso funciona sem problema:

uwsgi --ini /etc/uwsgi/my_wsgi.ini

Mas executar o seguinte não funciona (o uWSGI não inicia, mas não produz um erro):

sudo systemctl start uwsgi

Eu criei o seguinte serviço em /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

e my_wsgi.ini tem o seguinte:

[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

A execução de systemd-analyze verify uwsgi.service não retorna nada e sudo journalctl retorna o seguinte:

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) ....

Suspeito que uwsgi.service: Service hold-off time over, scheduling restart. aponte para o problema, mas não consegui descobrir.

    
por mathew 24.03.2017 / 22:25

1 resposta

3
A documentação do uwsgi afirma claramente:

NOTE: DO NOT daemonize the Emperor (or the master) unless you know what you are doing!!!

Infelizmente, você daemonizou o Imperador sem saber o que está fazendo. Da sua pergunta:

# Log everything and make daemon
daemonize       = /var/log/uwsgi/my.log

O problema é que o uwsgi é sensível ao systemd, e a unidade systemd diz ao systemd que o uwsgi irá notificar o systemd quando o uwsgi estiver pronto para iniciar o processamento das requisições. Por padrão, o uwsgi inicia neste modo quando em um sistema systemd, a menos que diga para daemonizar. Nesse caso, o uwsgi não conversa com o systemd. É por isso que systemd esperou por um tempo e finalmente desistiu de esperar que o uwsgi informasse ao sistema que estava pronto.

Em vez de fazer com que o uwsgi seja daemonize e registre-se diretamente em um arquivo, a documentação sugere que você deixe o logar com o padrão de erro padrão e deixe o systemd selecionar os logs e registrá-los. Você vai querer fazer isso se eventualmente tiver logging enviado para outro lugar, como uma pilha ELK. Por exemplo:

[Service]
StandardError=syslog

Ou você pode logar diretamente do uwsgi sem daemonizing.

logto = /var/log/uwsgi/my.log
    
por 25.03.2017 / 00:07