Phusion Passenger 不读取 .zshrc 环境变量

Phusion Passenger not reading .zshrc environment variables

我正在使用 Phusion Passenger 5.1.8 并在 .zshrc

中设置了以下内容
export SECRET_KEY_BASE='secure_key_base'
export DATABASE_NAME='db_production'
export DATABASE_PASSWORD='secure_db_pass'

然后我做了 source ~/.zshrc 并用 sudo service nginx restart 重启了 nginx。但是,我的应用程序抱怨找不到 SECRET_KEY_BASE 并且无法启动。如果我手动将它们放入 config/secrets.yml 那么一切正常。

我的 config/secrets.yml 有以下内容:

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

我的 config/database.yml 文件有:

production:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>

有人可以解释一下我将如何在 Phusion Passenger 中使用 zsh 环境变量吗?

谢谢!

所以问题是您在 .zshrc 中使用了环境变量,而您 运行 来自 systemd 的 nginx。两者之间没有任何联系。

你需要的是你的 nginx 应该有这些变量,这是 运行 通过 Systemd 服务。您需要使用所谓的 Drop-in

mkdir -p /etc/systemd/system/nginx.service.d

cat > /etc/systemd/system/nginx.service.d/90-nginx-myapp.conf <<EOF
[Service]
Environment=SECRET_KEY_BASE=XYZ
Environment=SECRET_KEY_BASE2=XYZ2
EnvironmentFile=-/etc/myapp/environment
EOF

您可以使用 Environment= 来声明一个变量。或者您可以使用带有环境变量的文件。

添加插件后,需要重新加载 systemd

$ systemctl daemon-reload
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/nginx.service.d
           └─90-nginx-myapp.conf
   Active: inactive (dead)

然后使用systemctl restart nginx

现在 nginx 应该得到你想要它拥有的变量。

编辑-1

如果您需要在 NGINX 和您的 shell 中使用变量。创建一个包含变量的文件,例如 beow

SECRET_KEY_BASE=XYZ
SECRET_KEY_BASE2=XYZ2

在你的 drop-in 中使用 EnvironmentFile= 并在你的 .bashrc.bash_profile.zshrc 中添加以下行

# set -a will make sure that X=Y is equivalent to export X=Y
set -a
source /etc/myapp/environment
# disable auto export of variable
set +a