我在ec2实例的环境变量中设置了一些用户名,密码和其他配置。我创建了一个virtualenv设置,并在我运行我的django服务器时处于活动状态。在该django服务器的设置文件中,我以os.environ ['variable']的形式访问环境变量。
在virtualenv之外,网站可以很好地访问这些变量。当我运行printenv时,我会看到所有变量和值。
然而,当我在它们上面调用os.environ时,服务器找不到它们并且正在抛出关键错误。
setup = ec2 instance - mod_wsgi - nginx - apache
更新 这开始通过以下方式在django.wsgi中设置变量来开始工作。
os.environ['SQL_PASSWORD'] = 'password'
一旦我升级到新的ec2硬件,这一点就停止了工作。我不确定这是如何相关的。
现在,最终的工作是使用apache配置文件中的SetEnv单独设置变量。仍然不是最佳的,因为我必须在生产机器上检查配置文件,但它会解锁我。
SetEnv SQL_PASSWORD password
答案 0 :(得分:0)
我在Ec2上使用nginx和uwsgi,并有一个构建我的服务器的厨师食谱。为了解决这个问题,在厨师中我的角色包含未存储在应用程序回购中的凭据。
主厨根据角色创建的/home/user/web/site/environment
文件。
MYSQL_DATABASE=databasename
MYSQL_USER=databaseuser
MYSQL_PASSWORD=databasepassword
MYSQL_HOST=databaseip
MYSQL_PORT=3306
REDIS_HOST=redishost
REDIS_PASSWORD=redispassword
REDIS_PORT=6379
REDIS_DB=0
MEDIA_ROOT=/home/user/web/site/media
STATIC_ROOT=/home/user/web/site/static
在我的production / staging / etc设置文件的开头我有以下块来读取环境文件
import os, re
try:
dirname = os.path.dirname(os.path.abspath(__file__))
# my environment file is always in the same place relative to my project's settings file
env_path = os.path.normpath(os.path.join(dirname, '..', '..', '..', '..', 'environment'))
with open(env_path) as f:
content = f.read()
for line in content.splitlines():
m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line)
if m1:
key, val = m1.group(1), m1.group(2)
m2 = re.match(r"\A'(.*)'\Z", val)
if m2:
val = m2.group(1)
m3 = re.match(r'\A"(.*)"\Z', val)
if m3:
val = re.sub(r'\\(.)', r'\1', m3.group(1))
os.environ.setdefault(key, val)
except IOError:
pass
Voila,设置由一个单独管理的仓库(厨师)控制,并加载到应用程序中。这可能不是 BEST 的方式,但它是相当安全的b / c如何锁定主厨仓库和目标服务器上的权限,并且易于部署。