【问题标题】:How to set environment variables for nginx to read?如何设置环境变量让nginx读取?
【发布时间】:2013-06-21 13:56:05
【问题描述】:

我试图在环境变量中设置我的 django "SECRET_KEY"。

我使用 virtualenv+virtualenvwrapper 作为环境。

在我输入之后

workon mydomain.com

我输入了

export SECRET_KEY=xxxxxx

当我尝试做时

echo $SECRET_KEY

我得到了我的价值(xxxxxx)

到目前为止一切顺利。但是当我尝试在浏览器中访问我的网站时(使用 ngnix 和 gunicorn),我得到了一个错误。

这是我的 gunicorn 主管脚本

[program:gunicorn]
directory = /home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/
command=/home/<USER>/.virtualenvs/<DOMAIN>/bin/gunicorn <PROJECT>.wsgi:application -c /home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/<APP>/gunicorn_conf.py
user = <USER>

这是我的 gunicorn_conf.py:

bind = "127.0.0.1:8000"
logfile = "/home/<USER>/logs/gunicorn.log"

这是我的 settings.py:

def get_env_variable(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = "Set the %s environment variable" % var_name
        raise ImproperlyConfigured(error_msg)
    

SECRET_KEY = get_env_variable("SECRET_KEY")

如何正确设置我的环境变量以便 ngnix 可以读取它?

编辑:追溯:

Traceback (most recent call last):
  File "/home/<USER>/.virtualenvs/<DOMAIN>/local/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 125, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/core/handlers/wsgi.py", line 236, in __call__
    self.load_middleware()
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/core/handlers/base.py", line 46, in load_middleware
    for middleware_path in settings.MIDDLEWARE_CLASSES:
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/conf/__init__.py", line 53, in __getattr__
    self._setup(name)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/conf/__init__.py", line 48, in _setup
    self._wrapped = Settings(settings_module)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/conf/__init__.py", line 126, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/downloads/django-trunk/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/<APP>/settings/staging.py", line 2, in <module>
    from .base import *
  File "/home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/<APP>/settings/base.py", line 40, in <module>
    SECRET_KEY = get_env_variable("SECRET_KEY")
  File "/home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/<APP>/settings/base.py", line 31, in get_env_variable
    raise ImproperlyConfigured(error_msg)
ImproperlyConfigured: Set the SECRET_KEY environment variable

【问题讨论】:

  • 你得到的错误是什么?你能显示堆栈跟踪吗?
  • 添加了错误的回溯。
  • Offtopic,你能给我解释一下吗,因为我正在尝试将环境变量传递给 SSI nginx html 文件,以便我可以动态更改值。
  • 省去一些麻烦,弄乱操作系统主管语法并使用 dotenv:pypi.org/project/python-dotenv

标签: django nginx environment-variables virtualenv


【解决方案1】:

您可以使用指令environment=VAR1=&lt;VAR1&gt;,VAR2=&lt;VAR2&gt; 在主管的配置中定义环境变量

类似的东西:

[program:gunicorn]
directory=/home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/
command=/home/<USER>/.virtualenvs/<DOMAIN>/bin/gunicorn <PROJECT>.wsgi:application -c      /home/<USER>/.virtualenvs/<DOMAIN>/<PROJECT>/<APP>/gunicorn_conf.py
user = <USER>
environment=SECRET_KEY=<SECRET_KEY>

【讨论】:

  • 你使用哪个版本的supervisord?自 3.0 起可用的环境
  • 运行版本:3.0a8-1.1
  • 似乎是我的密钥格式导致了问题。我的秘密包含像=+*% 这样的字符,如果我删除这些字符,并且只有普通字母,它就可以工作。
【解决方案2】:

您可以通过文件加载环境变量:

在您的应用文件夹中创建您自己的环境文件:

vim /home/ubuntu/workspace/apps/myapp/envfiles/myenvironment

将您的环境变量添加到该文件中:

APP_ENVIRONMENT="dev"

SECRET_KEY="mysecret_key"

然后将此环境加载到您的 gunicorn 服务文件中:

 sudo vim /etc/systemd/system/gunicorn.service

在 [Service] 博客中配置您的环境文件

 [Service]
 ....
 EnvironmentFile=/home/ubuntu/workspace/apps/myapp/envfiles/myenvironment

【讨论】:

  • 呃,没有。不要在系统范围的环境变量中为系统上的每个用户设置密钥。这应该是一个秘密。
  • 这只是从文件加载环境的示例。我们可以在我们的应用程序的文件系统中保护文件
猜你喜欢
  • 2018-07-01
  • 2017-09-04
  • 2014-08-12
  • 1970-01-01
  • 2012-08-30
  • 2017-03-28
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多