如何用django作为非root运行gunicorn

时间:2015-12-02 22:20:10

标签: python django gunicorn

我有一个django应用程序,我使用gunicorn来运行它。我开始使用gunicorn的脚本看起来像这样:

django_path=/path/to/your/manage.py 
settingsfile=my_name  
workers=2 

cd $django_path
exec gunicorn --env DJANGO_SETTINGS_MODULE=app.$settingsfile app.wsgi --workers=$workers &

这在我执行它时起作用。但是,当我在我的项目文件夹(cd /path/to/your/manage.py && ll)中查看我的数据库时,我得到了这个:

-rw-r--r-- 1 root root 55K Dec 2 13:33 db.sqlite3

这意味着我需要root权限来对数据库进行任何操作(例如执行createuser)。所以我浏览了Stackoverflow并试了几件事:

  • 我将整个脚本放在/etc/init.d/rc.local
  • 的顶部
  • 然后我将脚本作为脚本文件gunicorn_script.sh放入/etc/init.d,做了/usr/sbin/update-rc.d -f gunicorn_script.sh defaults
  • 最后,我尝试将此命令放在rc.local文件的顶部:su debian -c '/etc/init.d/gunicorn_script.sh start'以执行gunicorn_script作为debian用户

所有这些都启动了我的应用程序,但数据库的问题仍然存在(只有root权限)。

那么如何以非root用户身份运行该脚本?

2 个答案:

答案 0 :(得分:2)

我的项目文件夹中有一个脚本,用于运行gunicorn。这是一个标题:

#!/bin/bash
CUR_DIR=$(dirname $(readlink -f $0))
WORK_DIR=$CUR_DIR
USER=myusername
PYTHON=/usr/bin/python3
GUNICORN=/usr/local/bin/gunicorn

sudo -u $USER sh -c "cd $WORK_DIR; $PYTHON -W ignore $GUNICORN -c $WORK_DIR/config/gunicorn/gunicorn.conf.py --chdir $WORK_DIR myappname.wsgi:application

<强>更新: 将以下代码放入文件/etc/init.d/myservice,设置root所有者,并为所有者授予+x权限。

#!/bin/bash
#chkconfig: 345 95 50
#description: Starts myservice
if [ -z "$1" ]; then
echo "`basename $0` {start|stop}"
   exit
fi

case "$1" in
start)
   sh /path/to/run_script.sh start &
;;

stop)
   sh /path/to/run_script.sh stop
;;
esac

现在您可以使用sudo service myservice start

对不起,我对systemd还不熟悉,但有了它可能会更容易。

答案 1 :(得分:1)

好的,所以我发现db.sqlite3将通过我从root运行的makemigrationsmigrate命令在django中创建。

因此,权限问题。我转向debian并从那里运行命令等瞧:

-rw-r--r-- 1 debian debian 55K Dec 2 13:33 db.sqlite3