我想使用SECRET_KEY的环境变量配置supervisor来控制我的django 1.6项目中的gunicorn。
我将.bashrc中的密钥设置为
export SECRET_KEY=[my_secret_key]
我有一个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
然后在主管中配置我的项目的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
如果我使用我的shell脚本启动gunicorn它不会抛出任何错误,但是当我使用supervisor启动它时它失败了,我在日志中看到它没有“找到”我的SECRET_KEY。
配置主管读取我的shell变量的正确方法是什么(除非有更合适的方法,否则我不想将它们保存在我的.bashrc中)?
答案 0 :(得分:24)
好的,我想我明白了。
我曾尝试过包含
environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"
在主管的conf文件中,但它不喜欢非字母数字字符,我不想把我的密钥放在conf文件中,就像我在git中一样。
在supervisor's docs开玩笑后,我也试过了:
HOME="/home/django", USER="django"
但没有用。
最后我尝试了这个并且现在正在工作!:
environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY
也许虽然它起作用但它不是最好的解决方案。我很乐意了解更多。
修改强>
最后,Ewan让我发现使用bash来设置env vars并不是最好的选择。因此#Ewan指出的一个解决方案将使用:
[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"
另一种解决方案我发现,对于那些使用virtualenv的人来说,是在virtualenv的“激活”脚本中导出env变种,也就是说,编辑你的virtualenv / bin / activate文件并在最后添加您的SECRET_KEY。
这样您可以使用由key generators for django生成的%字符,如果您不使用主管,则该字符有效。
我重启了我的服务器而没有记录检查它是否有效。使用此选项,我不必编辑我的密钥,我可以保持我的conf文件版本化,无论我使用主管,暴发户还是其他任何东西(或者什么都没有,只是枪支),它都能正常工作。
无论如何,我知道我没有发现任何新内容(很好@Ewan向主管提出了一个问题)但是我正在学习并希望这对其他人有用。
答案 1 :(得分:8)
此外,如果你使用gunicorn配置文件:
gunicorn -c gunicorn.py myproject.wsgi
可以在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',
]
答案 2 :(得分:6)
您的.bashrc
仅适用于交互式shell,因此在以用户身份运行shell脚本时会起作用,但是在后台运行的主管不会传递这些值。
相反,在你的supervsior .ini
文件中设置环境变量(documentation中的更多信息)。
e.g。
[program:my_django_project]
environment=SECRET_KEY="my_secret_key"
经过一些试验和错误后,我注意到主管.ini
文件不喜欢在环境变量部分中有%
(即使你引用它......) 。根据您在评论中的示例,我通过supervisor==3.0
安装了pip
来尝试此操作,它可以运行:
environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l$0(+@x$3cr&)z^lmg+pqw^6wkyi"
唯一的区别是我删除了%
标志。 (我尝试用\%
转义它,但这仍然无效)
针对此错误向主管提出issue #291。
如上所述,如果您的密钥中存在%
,则必须将其转义为python-style:%%
答案 3 :(得分:1)
您可以通过添加另一个%字符来转义%字符。
否则,引用这些值是可选的,但建议使用。要转义百分比字符,只需使用两个。 (例如
URI="/first%%20name"
)