如何解决nginx + uwsgi + Django 不使用 venv activate 脚本中设置的环境变量
Tldr;通过生产 Web 服务器访问应用程序时,Django 未使用在我的 venv 的激活脚本中设置的环境变量。
堆栈:Nginx -> uwsgi -> django + venv
像许多其他人一样,我正在尝试将我的敏感关键信息移出我的 settings.py 文件。为此,我在本地 venv 环境的 activate 脚本末尾添加了多个导出语句。
settings.py
SECRET_KEY = os.environ.get('DJANGO_PROJECT_KEY','********************')
DEBUG = os.environ.get('DJANGO_PROJECT_DEBUG','') != 'False'
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID','')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY','')
env/bin/activate
export SECRET_KEY = '*********************'
export DEBUG="True"
export AWS_ACCESS_KEY_ID="********************"
export AWS_SECRET_ACCESS_KEY="**************************"
从那里,我可以重新加载环境并通过运行确认它们的键值对可用
python manage.py shell
>> import os
>> os.environ
显示了正确的键值。此外,我可以使用
启动开发服务器python manage runserver 0:8080
并且能够根据需要将文件发布到 AWS S3 存储桶。但是,一旦我重新启动服务器以重新启动 uWsgi 进程并通过 Nginx 从其域访问该站点,我就无法将文件发布到 S3。相反,我收到了 NoCredentials 错误,尽管当调试设置设置为 TRUE 时,我可以在可用的设置信息中看到相关的 AWS 密钥信息。
项目.ini
# initialize the uwsgi instance to connect Nginx to django
[uwsgi]
# base directory of project
chdir = /home/ubuntu/project/project
# django wsgi file in python module Syntax
module = project.wsgi
# path to the virtual environment
home = /home/ubuntu/project/env
...
# clear the environemtn on exit
vacuum = true
etc/Nginx/sites-enabled/project.conf
upstream django {
server unix:///tmp/project/uwsgi.sock;
}
server {
listen 80;
server_name mydomain.in;
charset utf-8;
client_max_body_size 250M;
location /media {
alias /home/ubuntu/project/media;
}
location /static {
alias /home/ubuntu/project/project/static;
}
location / {
uwsgi_pass django;
include /etc/Nginx/uwsgi_params;
}
}
我可以在单独使用 uwsgi 访问 Django 项目时上传文件。
uwsgi --http 0:8080 --wsgi-file project/wsgi.py
为什么在启动开发服务器时可以使用 activate 脚本中导出的变量,而通过 Nginx / uWsgi 访问项目时却不能使用?
解决方法
对我所做的凭据内容的简单修复如下:
with open('credentials.txt','r') as credentials:
for lines in credentials.read().split('\n'):
dbcreden.append(lines.strip())
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql','NAME': dbcreden[0],'USER':dbcreden[1],'PASS':dbcreden[2],'HOST':'localhost','PORT': '3306'
}
}
对于密钥类似的东西:
with open('secretkey.txt') as f:
SECRET_KEY = f.read().strip()
官方 django 文档中也建议这样做,因此它应该是安全的。
https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。