【发布时间】:2018-02-04 18:46:54
【问题描述】:
我有一个在 Gunicorn 上运行的 Django 应用程序,由 Ansible 管理的 SupervisorD 管理。
我希望 Django 从环境中读取 DJANGO_SECRET_KEY 变量,因为我不想将我的密钥存储在配置文件或 VCS 中。为此,我从settings.py 的环境中读取了密钥:
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
看着Supervisor docs 它说:
注意子进程将继承用于启动“supervisord”的shell的环境变量,除了这里被覆盖的那些。请参阅子流程环境。
这是我的supervisor.conf:
[program:gunicorn]
command=/.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid
directory=/.../http/homepage
当我设置变量并从 shell 运行 Gunicorn 命令时,它启动得很好:
$ DJANGO_SECRET_KEY=XXX /.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid
但是,当我在 shell 中设置变量并重新启动 Supervisor 服务时,我的应用程序无法启动,并出现关于未找到变量的错误:
$ DJANGO_SECRET_KEY=XXX supervisorctl restart gunicorn
gunicorn: ERROR (not running)
gunicorn: ERROR (spawn error)
查看 Supervisor 错误日志:
File "/.../http/homepage/homepage/settings.py", line 21, in <module>
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
File "/.../.virtualenvs/homepage/lib/python2.7/UserDict.py", line 40, in __getitem__
raise KeyError(key)
KeyError: 'DJANGO_SECRET_KEY'
[2017-08-27 08:22:09 +0000] [19353] [INFO] Worker exiting (pid: 19353)
[2017-08-27 08:22:09 +0000] [19349] [INFO] Shutting down: Master
[2017-08-27 08:22:09 +0000] [19349] [INFO] Reason: Worker failed to boot.
我也试过重启supervisor服务,还是出现同样的错误:
$ DJANGO_SECRET_KEY=XXX systemctl restart supervisor
...
INFO exited: gunicorn (exit status 3; not expected)
我的问题是如何让 Supervisor 将环境变量“传递”给它的子进程?
【问题讨论】:
-
这完全是错误的方式。主管不在您的用户 ID 下运行。您应该在主管配置中设置变量,而不是相反。
-
@DanielRoseman 我在 VCS 中有我的主管配置,所以我无法将我的密钥放入其中。
-
读取
DJANGO_SECRET_KEY环境变量与主管配置无关。不知道你是怎么做的,但你可以使用os.environ.get('DJANGO_SECRET_KEY')在我们的 django 设置文件中赋值。你也可以使用像django-environ这样的包。 -
@demonno 我已经在 Django 的
settings.py中有os.environ.get('DJANGO_SECRET_KEY')。问题是 Gunicorn 进程从 Supervisor 启动时未设置此变量。
标签: django ansible environment-variables supervisord secret-key