如何在任何产品(Nginx 和 Gunicorn)中访问和设置环境变量
How to access and set Environment Variables any production (Nginx and Gunicorn)
我正在尝试为 Ubuntu 上的 Nginx 和 Gunicorn 服务的 Django 项目设置环境变量。
变量是为 Ubuntu 用户设置的,我可以使用 printenv VAR_EMAIL
.
查看值
但是当我使用它们的 django 设置时它不起作用,将它们用作 os.environ['VAR_EMAIL']
,这不会在生产中获取变量的值并且服务器不起作用。
但是这在开发方面有效。
2020 年 5 月 1 日更新:
我使用了 systemd 并在 gunicorn.service file.This 中传递了这样的变量将无法正常工作仍然会出现关键错误,)将 post 确切的错误)因为它是在 Ubuntu 上生产的但我正在 Windows 上进行开发,它与开发中的环境变量配合得很好。
os.environ['var_name']
是正确的访问方式吗?
我也尝试了 os.environ.get('var_name')
正如我在一些视频中看到的那样,environ 有 .get()
来访问该值。我会再试一次,也许我做了一些 mistake.Feel 免费询问所需的任何信息。
已回答 - 这是我这边的错误。
你用什么来监督和 运行 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=
Now after many problems i faced because of which i just hard coded the
variables in code for long time the solution i reached is in this
update.Read the complete answer to get it.
这是一个更新,环境变量的传递方式很奇怪。
每个变量都需要以下方法,但您还需要将变量添加到 etc/environment
并在其中添加环境变量。
The environment Variables were to be set in a single line with spaces
separating each key+value pair. (Not like mentioned in selected Answer)
Couldn't get it to work with supervisor though.
因此,正确的方法是在本 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 。检查所有链接的选定答案。
这行不通:
我正在尝试为 Ubuntu 上的 Nginx 和 Gunicorn 服务的 Django 项目设置环境变量。
变量是为 Ubuntu 用户设置的,我可以使用 printenv VAR_EMAIL
.
但是当我使用它们的 django 设置时它不起作用,将它们用作 os.environ['VAR_EMAIL']
,这不会在生产中获取变量的值并且服务器不起作用。
但是这在开发方面有效。
2020 年 5 月 1 日更新:
我使用了 systemd 并在 gunicorn.service file.This 中传递了这样的变量将无法正常工作仍然会出现关键错误,)将 post 确切的错误)因为它是在 Ubuntu 上生产的但我正在 Windows 上进行开发,它与开发中的环境变量配合得很好。
os.environ['var_name']
是正确的访问方式吗?
我也尝试了 os.environ.get('var_name')
正如我在一些视频中看到的那样,environ 有 .get()
来访问该值。我会再试一次,也许我做了一些 mistake.Feel 免费询问所需的任何信息。
已回答 - 这是我这边的错误。
你用什么来监督和 运行 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=
Now after many problems i faced because of which i just hard coded the variables in code for long time the solution i reached is in this update.Read the complete answer to get it.
这是一个更新,环境变量的传递方式很奇怪。
每个变量都需要以下方法,但您还需要将变量添加到 etc/environment
并在其中添加环境变量。
The environment Variables were to be set in a single line with
spaces
separating each key+value pair. (Not like mentioned in selected Answer) Couldn't get it to work with supervisor though.
因此,正确的方法是在本 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 。检查所有链接的选定答案。
这行不通: