37

我想在我的 django 1.6 项目中使用 SECRET_KEY 的环境变量配置主管来控制 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,它不会引发任何错误,但是当我使用主管启动它时它会失败,并且我在日志中看到它没有“找到”我的 SECRET_KEY。

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

4

4 回答 4

28

好吧,我想我明白了。

我试过包括

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"

在主管的 conf 文件中,但它不喜欢非字母数字字符,我不想在 conf 文件中拥有我的密钥,因为我在 git 中有它。

在查看主管的文档后,我还尝试过:

HOME="/home/django", USER="django"

但没有用。

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

environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY

也许虽然它正在工作,但它不是最好的解决方案。我很乐意了解更多。

编辑:

最后,Ewan 让我看到使用 bash 来设置环境变量并不是最好的选择。因此,正如#Ewan 所指出的,一种解决方案是使用:

[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"

对于那些使用 virtualenv 的人,我发现的另一个解决方案是在 virtualenv 的“激活”脚本中导出环境变量,也就是说,编辑您的 virtualenv/bin/activate 文件并在末尾添加您的 SECRET_KEY。

这样你就可以使用 % chars 由django 的密钥生成器生成,如果你不使用主管,它是有效的。

我在没有登录的情况下重新启动了我的服务器以检查它是否有效。使用此选项,我不必编辑我的密钥,我可以保持我的 conf 文件版本,并且无论我使用主管、新贵还是其他任何东西(或者什么都不用,只是 gunicorn),它都可以工作。

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

于 2013-09-27T15:21:38.950 回答
9

此外,如果您使用 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',
]
于 2015-07-09T08:56:29.087 回答
6

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

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

例如

[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"

唯一的区别是我删除了这个%标志。(我尝试用它来逃避它,\%但这仍然没有用)

编辑 2

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

编辑 3

如上述问题所述,如果 a%存在于您的密钥中,则必须以 python 样式转义:%%

于 2013-09-27T15:16:32.987 回答
1

您可以通过添加另一个 % 字符来转义 % 字符。

否则,引用这些值是可选的,但建议使用。要转义百分比字符,只需使用两个。(例如URI="/first%%20name"

取自这里:http ://supervisord.org/configuration.html

于 2014-08-18T14:32:26.360 回答