Não é possível iniciar o Gunicorn via Supervisor após a reinicialização do servidor

1

Eu tenho um aplicativo Django "djngxgun" que usa Nginx e Gunicorn. Acabei de instalar o Supervisor para poder usá-lo para gerenciar meus processos Gunicorn. O problema é que o Supervisor não está iniciando o Gunicorn depois que eu reiniciei o servidor. Quando eu inicio o Gunicorn via Supervisor ("sudo supervisorctl start djngxgun"), vejo o seguinte erro repetido no meu arquivo error.log do Gunicorn:

2014-02-28 15:36:47 [4753] [INFO] Starting gunicorn 18.0
Traceback (most recent call last):
  File "/home/djngxgun/venv/djngxgun/bin/gunicorn", line 9, in <module>
    load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
  File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 71, in run
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
  File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 143, in run
    Arbiter(self).run()
  File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 172, in run
    self.start()
  File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 124, in start
    self.pidfile.create(self.pid)
  File "/home/djngxgun/venv/djngxgun/local/lib/python2.7/site-packages/gunicorn/pidfile.py", line 38, in create
    fd, fname = tempfile.mkstemp(dir=fdir)
  File "/usr/lib/python2.7/tempfile.py", line 300, in mkstemp
    return _mkstemp_inner(dir, prefix, suffix, flags)
  File "/usr/lib/python2.7/tempfile.py", line 235, in _mkstemp_inner
    fd = _os.open(file, flags, 0600)
OSError: [Errno 13] Permission denied: '/var/run/tmpcda84p'

Parece que o problema é que a conta djngxgun precisa criar um arquivo temporário em / var / run, mas as permissões desse diretório o estão impedindo:

drwxr-xr-x 14 root root 640 Feb 28 15:36 /run

Se eu mudar / executar manualmente (/ var / run é um link simbólico para / run) para que o dono do grupo seja "adm" e seja gravável por grupo e o djngxgun seja adicionado ao grupo adm como este,

drwxrwxr-x 14 root adm 640 Feb 28 15:36 /run

... Eu posso começar o Gunicorn via Supervisor sem nenhum problema. No entanto, se eu reiniciar o servidor, a propriedade do grupo e as permissões serão revertidas para as configurações originais, o que fará com que o erro volte a ocorrer. Como seria de esperar, se eu simplesmente executar o script de inicialização manualmente ("sudo / www / djngxgun / bin / start-gunicorn &"), o Gunicorn será iniciado sem qualquer problema.

Estou configurando o Gunicorn e / ou o Supervisor incorretamente? Eu não vejo como eu posso dar a volta precisando escrever para / var / run se eu usar o Supervisor, mas não posso se é de propriedade do root. Eu não acho que eu quero estar executando meu aplicativo através do usuário root. Não vi nenhuma configuração do Gunicorn ou do Supervisor que resolvesse esse problema. Existe outra maneira de fazer isso?

Obrigado.

Este é o meu script de inicialização do Gunicorn:

#!/bin/bash
NAME=djngxgun
DJANGODIR=/www/djngxgun
USER=$NAME
GROUP=$NAME
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=conf.prod
DJANGO_WSGI_MODULE=conf.wsgi

WORKON_HOME=/home/${USER}/venv
source 'which virtualenvwrapper.sh'
workon $NAME
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

echo "Starting $NAME as 'whoami'"
exec gunicorn $DJANGO_WSGI_MODULE:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER \
  --group=$GROUP \
  --bind=127.0.0.1:8000 \
  --pid /var/run/gunicorn.pid \
  --access-logfile /var/log/gunicorn/access.log \
  --error-logfile /var/log/gunicorn/error.log \
  --log-level=debug

Este é o meu arquivo de configuração do Supervisor "/etc/supervisor/conf.d/djngxgun.conf"

[program:djngxgun]
command = /www/djngxgun/bin/start-gunicorn
user=djngxgun
stdout_logfile = /var/log/gunicorn/supervisor.log
redirect_stderr = true
    
por Jim 01.03.2014 / 01:27

2 respostas

0

Eu percebi isso. A solução é definir "user = root" no arquivo de configuração do Supervisor do projeto. A documentação diz: "Se o supervisord for executado como root, essa conta de usuário do UNIX será usada como conta que executa o programa ". Assim, definir o usuário dessa maneira é equivalente a executar o script manualmente usando "sudo".

    
por 01.03.2014 / 02:37
6

Você não deve estar executando o seu servidor gunicorn como root, apenas pense se alguém encontrou um exploit no seu código pode fazer qualquer coisa para o servidor.

Coloque o pidfile em / tmp ou / var / tmp e execute como um usuário não privilegiado.

    
por 24.03.2014 / 14:19