【问题标题】:How to access and set Environment Variables any production (Nginx and Gunicorn)如何访问和设置任何生产环境变量(Nginx 和 Gunicorn)
【发布时间】:2020-08-10 17:37:07
【问题描述】:

我正在尝试为 Ubuntu 上的 Nginx 和 Gunicorn Served Django 项目设置环境变量。 这些变量是为 Ubuntu 用户设置的,我可以使用 printenv VAR_EMAIL 查看值。

但是当我使用它们时 django 设置它不起作用,将它们用作os.environ['VAR_EMAIL'],这不会在生产中获取变量的值,并且服务器不起作用。

但这在开发方面有效。

2020 年 5 月 1 日更新: 我使用 systemd 并在 gunicorn.service 文件中传递了这样的变量。这将不起作用仍然会出现关键错误,)将发布确切的错误),因为它是在 Ubuntu 上生产的,但我正在 Windows 上开发,它适用于环境发展中的变量。 os.environ['var_name'] 是正确的访问方式吗? 我还尝试了os.environ.get('var_name'),正如我在一些视频中看到的那样,environ 有.get() 来访问该值。我会再试一次,也许我犯了一些错误。请随时询问所需的任何信息。

已回答 - 这是我的错误。

【问题讨论】:

  • 您的部署环境如何?你在用 docker 吗?
  • Nginx,Gunicorn,Supervisor ... 在带有 Amazon RDS MySQL DB 的 EC2 Ubuntu 最新实例上。我没有使用 docker。

标签: django ubuntu nginx gunicorn production-environment


【解决方案1】:

现在我遇到了很多问题,因此我只是硬编码了 代码中的变量很长一段时间我达到的解决方案就是这个 更新。阅读完整答案以获得它。

这是一个更新,环境变量的传递方式很奇怪。 每个变量都需要以下方法,但您还需要将变量添加到 etc/environment 并在其中添加环境变量。

环境变量将在一行中设置,spaces 分隔每个键+值对。 (不像所选答案中提到的那样) 但无法让它与主管一起工作。

因此,正确的方法是在 Systemd 文档中提到:EnvironmentsSystemd

Environment = "KEY_NAME_1=VALUE_KEY_1" "KEY_NAME_2=VALUE_KEY_2" ....

然后用户PassEnvironment 激活该会话中的那些。 通过这种方式,您可以使用 PassEnvironment 为不同的服务启用不同的环境变量。

PassEnvironment = KEY_NAME_1 KEY_NAME_2 ....

这是由空格分隔的键名。 这应该可以帮助您设置 systemd 。检查所有链接的选定答案。

这不起作用:

【讨论】:

    【解决方案2】:

    您使用什么来监督和运行 Ubuntu 中的 gunicorn 进程?如果您不使用任何工具,我建议您使用systemd,gunicorn 文档中有一个关于如何设置的小指南:https://docs.gunicorn.org/en/stable/deploy.html#systemd

    之后,您可以在 systemd 配置文件中设置环境变量,如下所示,在 systemd 配置文件的 [Service] 部分下:

    [Service]
    Environment="VAR_EMAIL=var-email"
    Environment="ANOTHER_VAR=another-var"
    

    如果您希望将这些变量放在单独的文件中,也可以使用 EnvironmentFile 指令:https://www.freedesktop.org/software/systemd/man/systemd.exec.html#EnvironmentFile=

    【讨论】:

    • 然后检查以下问题:stackoverflow.com/questions/12900402/…
    • 我将按照您的建议使用 systemd,我按照文档中的说明完美地从链接中插入环境变量并进行了解释,但现在一切都崩溃了。Supervisor.sock 文件丢失错误并且没有其他解决方案似乎有效。
    • 这不起作用,我安装了所有东西并正确完成了所有操作,但环境变量仍然没有通过。我尝试了该文件并将所有内容也插入了文件中。两者都不起作用。有什么解决方法吗?
    • 你在修改 systemd 配置文件后是否运行了systemctl daemon-reload && systemctl restart <your-app>
    • 是的,我做到了。甚至使用 PassEnvironment 因为它不起作用,所以必须尝试一切。更新了有问题的服务文件的屏幕截图。它总是给出关键错误..
    猜你喜欢
    • 2014-09-24
    • 2020-04-29
    • 2014-12-17
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多