如何使用supervisor,gunicorn和django的环境变量(1.6)

equ*_*ium 36 django shell supervisord gunicorn

我想使用SECRET_KEY的环境变量配置supervisor来控制我的django 1.6项目中的gunicorn.

我将.bashrc中的密钥设置为

export SECRET_KEY=[my_secret_key] 
Run Code Online (Sandbox Code Playgroud)

我有一个shell脚本来启动gunicorn:

NAME="myproject"
LOGFILE=/home/django/myproject/log/gunicorn.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
DJANGO_WSGI_MODULE=myproject.wsgi

USER=django
GROUP=django
IP=0.0.0.0
PORT=8001

echo "Starting $NAME"

cd /home/django/myproject/myproject
source /home/django/.virtualenvs/myproject/bin/activate

test -d $LOGDIR || mkdir -p $LOGDIR

exec gunicorn ${DJANGO_WSGI_MODULE} \
 --name $NAME \
 --workers $NUM_WORKERS \
 --user=$USER --group=$GROUP \
 --log-level=debug \
 --bind=$IP:$PORT
 --log-file=$LOGFILE 2>>$LOGFILE
Run Code Online (Sandbox Code Playgroud)

然后在主管中配置我的项目的gunicorn服务器:

[program:my_django_project]
directory=/home/django/my_django_project/my_django_project
command=/home/django/my_django_project/my_django_project/gunicorn.sh
user=django
autostart=true
autorestart=true
stdout_logfile=/home/django/my_django_project/log/supervisord.log
stderr_logfile=/home/django/my_django_project/log/supervisor_error.log
Run Code Online (Sandbox Code Playgroud)

如果我使用我的shell脚本启动gunicorn它不会抛出任何错误但是当我用supervisor启动时它会失败并且我在日志中看到它没有"找到"我的SECRET_KEY.

配置主管来读取我的shell变量的正确方法是什么(除非有更合适的方法,否则我不想将它们保存在我的.bashrc中)?

equ*_*ium 26

好吧,我想我明白了.

我试过包括

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"
Run Code Online (Sandbox Code Playgroud)

在主管的conf文件中,但它不喜欢非字母数字字符,我不想把我的密钥放在conf文件中,就像我在git中一样.

在找到主管的文档后,我也尝试过:

HOME="/home/django", USER="django"
Run Code Online (Sandbox Code Playgroud)

但没有奏效.

最后我尝试了这个并且现在正在工作!:

environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

也许虽然它的工作并不是最好的解决方案.我很乐意了解更多.

编辑:

最后,Ewan让我发现使用bash来设置env vars并不是最好的选择.因此#Ewan指出的一个解决方案是使用:

[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"
Run Code Online (Sandbox Code Playgroud)

我找到的另一个解决方案,对于那些使用virtualenv的人来说,可以在virtualenv的"激活"脚本中导出env变量,也就是说,编辑你的virtualenv/bin/activate文件并在最后添加你的SECRET_KEY.

这样,您可以使用密钥生成器为django生成的%字符,如果您不使用管理程序,则有效.

我重新启动了我的服务器而没有记录检查它是否有效.使用此选项,我不必编辑我的密钥,我可以保持我的conf文件版本化,无论我使用主管,暴发户还是其他任何东西(或者什么都没有,只是枪支),它都能正常工作.

无论如何,我知道我没有发现任何新的东西(很好@Ewan向主管提出了一个问题)但我正在学习并希望这对其他人有用.

  • 我将环境变量放在`../ bin/activate` virtualenv脚本中,这对我有用.日Thnx (3认同)

Mad*_*ash 8

另外,如果你使用gunicorn配置文件:

gunicorn -c gunicorn.py myproject.wsgi
Run Code Online (Sandbox Code Playgroud)

可以gunicorn.py像这样在文件中传递环境变量:

bind = "0.0.0.0:8001"
workers = 3
proc_name = "myproject"
user = "django"
group = "django"
loglevel = "debug"
errorlog = "/home/django/myproject/log/gunicorn.log"
raw_env = [
   'DATABASE_URL=postgres://user:password@host/dbname',
   'SECRET_KEY=mysecretkey',
]
Run Code Online (Sandbox Code Playgroud)


Ewa*_*wan 6

您的.bashrc工作仅适用于交互式shell,因此在以用户身份运行shell脚本时可以正常工作,但是在后台运行的主管不会传递这些值.

相反,在您的supervsior .ini文件中设置环境变量(文档中的更多信息).

例如

[program:my_django_project]
environment=SECRET_KEY="my_secret_key"
Run Code Online (Sandbox Code Playgroud)

经过一些试验和错误后,我注意到supervisor .ini文件不喜欢%在环境变量部分(即使你引用它...).根据您在评论中的示例,我已经尝试使用supervisor==3.0已安装的通道pip并且它可以工作:

environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l$0(+@x$3cr&)z^lmg+pqw^6wkyi"
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我已经删除了%标志.(我尝试逃避它,\%但这仍然无法正常工作)

编辑2

针对此错误向主管提出了问题#291.

编辑3

如上所述,如果%您的密钥中存在a,则必须将其转义为python-style:%%