服务器重启后无法通过主管启动 Gunicorn

Jim*_*Jim 1 python django supervisord gunicorn

我有一个使用 Nginx 和 Gunicorn 的 Django 应用程序“djngxgun”。我刚刚安装了 Supervisor,以便我可以使用它来管理我的 Gunicorn 进程。问题是在我重新启动服务器后,Supervisor 没有启动 Gunicorn。当我通过主管启动 Gunicorn 时(“sudo supervisorctl start djngxgun”),我看到在我的 Gunicorn error.log 文件中重复出现以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

看起来问题是 djngxgun 帐户需要在 /var/run 中创建一个临时文件,但该目录的权限阻止了它:

drwxr-xr-x 14 root root 640 Feb 28 15:36 /run
Run Code Online (Sandbox Code Playgroud)

如果我手动更改 /run(/var/run 是 /run 的符号链接),以便它的组所有者是“adm”并且它是组可写的,并且 djngxgun 被添加到这样的 adm 组中,

drwxrwxr-x 14 root adm 640 Feb 28 15:36 /run
Run Code Online (Sandbox Code Playgroud)

...我可以通过主管启动 Gunicorn 没有任何问题。但是,如果我重新启动服务器,组所有权和权限将恢复为原始设置,这会导致错误再次发生。如您所料,如果我只是手动运行启动脚本(“sudo /www/djngxgun/bin/start-gunicorn &”),Gunicorn 启动时不会出现任何问题。

我是否错误地配置了 Gunicorn 和/或 Supervisor?如果我使用 Supervisor,我不知道如何避免需要写入 /var/run 但如果它由 root 拥有,我就不能。我不认为我想通过 root 用户运行我的应用程序。我没有看到任何可以解决此问题的 Gunicorn 或 Supervisor 设置。有没有另一种方法可以做到这一点?

谢谢。

这是我的 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
Run Code Online (Sandbox Code Playgroud)

这是我的主管配置文件“/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
Run Code Online (Sandbox Code Playgroud)

小智 7

你不应该以 root 身份运行你的 gunicorn 服务器,想想如果有人在你的代码中发现了一个漏洞可以对服务器做任何事情。

将 pidfile 放在 /tmp 或 /var/tmp 中并以非特权用户身份运行。