nginx + uwsgi + Django 不使用 venv activate 脚本中设置的环境变量

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?