Rails没有正确读取database.yml中的环境变量

kib*_*yte 6 database passenger environment-variables ruby-on-rails-3

我的database.yml设置如下:

development:
  adapter: mysql2
  encoding: utf8
  database: devel
  username: root
  host: localhost
  port: 3306
  timeout: 5000

# ... snip ...

production:
  adapter: mysql2
  encoding: utf8
  database: prod
  username: <%= ENV["DB_USER"] %>
  password: <%= ENV["DB_PASSWORD"] %>
  host: <%= ENV["DB_HOST"] %>
  port: 3306
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

但问题是,尽管设置了环境变量,但Rails并未正确阅读这些变量.当我在EC2上启动我的Phusion支持的Nginx服务器时,我收到以下消息:

Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)
Run Code Online (Sandbox Code Playgroud)

我确认Phusion正在生产环境中启动Rails; 我将开发和测试配置中的用户名和主机更改为唯一名称,并'root'@'localhost'始终显示为错误消息.此外,如果我将用户名和密码硬编码到YAML文件中,服务器将正常启动.

我怀疑我没有正确设置我的环境变量,因为MySQL一直声称我试图以"root"身份登录而没有密码.我最初从.bashrc文件导出它们,但在阅读完这个问题后,我意识到这不是正确的方法.在搜索之后,我发现了这篇博文,所以我按照说明创建了这三个文件:

在/ usr/local/etc中/ ENV

export RAILS_ENV=production
export DB_PASSWORD= (snip)
export DB_USER=doorbells
Run Code Online (Sandbox Code Playgroud)

在/ usr/local/etc中/ ruby​​_wrapper

#!/bin/sh

source /usr/local/etc/env
exec /home/rooby/.rvm/wrappers/ruby-1.9.3-p362@doorbells-dev/ruby "$@"
Run Code Online (Sandbox Code Playgroud)

/etc/profile.d/env.sh

#!/bin/sh

source /usr/local/etc/env
Run Code Online (Sandbox Code Playgroud)

在我的nginx.conf文件中,我使用这一行:

passenger_ruby /usr/local/etc/ruby_wrapper;
Run Code Online (Sandbox Code Playgroud)

我重新启动了我的服务器无济于事.有任何想法吗?

小智 -5

首先,使用

username: ENV["DB_USER"]
password: ENV["DB_PASSWORD"]
host: ENV["DB_HOST"]
Run Code Online (Sandbox Code Playgroud)

反而

username: <%= ENV["DB_USER"] %>
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的。database.yml 被评估为 ERB 模板,因此他绝对“应该”使用 `&lt;%= %&gt;` 语法。 (3认同)