Phusion Passenger没有读取.zshrc环境变量

时间:2017-08-24 03:02:45

标签: ruby-on-rails nginx passenger zshrc

我正在使用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'] %>

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

谢谢!

1 个答案:

答案 0 :(得分:2)

所以问题是你在.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=来声明变量。或者您可以使用带有环境变量的文件。

添加了drop-in后,需要重新加载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

在您的插入广告中使用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