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