我有一个使用Nginx和Gunicorn的Django应用程序“djngxgun”。 我只是安装了主pipe,以便我可以使用它来pipe理我的Gunicorn进程。 问题是Supervisor在重新启动服务器后没有启动Gunicorn。 当我通过Supervisor启动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'
看起来问题是,djngxgun帐户需要在/ var / run中创build一个临时文件,但该目录的权限正在阻止它:
drwxr-xr-x 14 root root 640 Feb 28 15:36 /run
如果我手动更改/运行(/ var / run是一个到/运行的符号链接),以便它的组拥有者是“adm”,并且它是组可写的,并且djngxgun被添加到adm组,
drwxrwxr-x 14 root adm 640 Feb 28 15:36 /run
我可以通过Supervisor启动Gunicorn,没有任何问题。 但是,如果我重新启动服务器,则组的所有权和权限将恢复为导致错误再次出现的原始设置。 正如你所期望的,如果我只是手工运行启动脚本(“sudo / www / djngxgun / bin / start-gunicorn&”),Gunicorn启动没有任何问题。
我是否正确configurationGunicorn和/或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
这是我的Supervisorconfiguration文件“/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
你不应该以root身份运行你的gunicorn服务器,只是想如果有人发现你的代码中的漏洞利用可以对服务器做任何事情。
将pidfile放在/ tmp或/ var / tmp中,并以非特权用户身份运行。
我想到了。 解决办法是在项目的Supervisorconfiguration文件中设置“user = root”。 该文件说:“如果supervisord以root身份运行,这个UNIX用户帐户将被用作运行该程序的帐户。” 因此,这样设置用户就相当于使用“sudo”手动运行脚本。