6

我的 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

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

Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)

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

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

/usr/local/etc/env

export RAILS_ENV=production
export DB_PASSWORD= (snip)
export DB_USER=doorbells

/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 "$@"

/etc/profile.d/env.sh

#!/bin/sh

source /usr/local/etc/env

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

passenger_ruby /usr/local/etc/ruby_wrapper;

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

4

3 回答 3

2

上述解决方案对我不起作用。但是,我找到了 如何在 YAML 文件中使用变量的解决方案?

我的 .yml 文件包含以下内容:

development:
gmail_username: <%= ENV["GMAIL_USERNAME"] %>
gmail_password: <%= ENV["GMAIL_PASSWORD"] %>

解决方案如下所示:

template = ERB.new File.new("path/to/config.yml.erb").read
processed = YAML.load template.result(binding)

因此,当您在 .yml 文件中引入 scriptlet 标签时,它更像是 erb 模板。所以先把它作为一个erb模板读取,然后如上图加载yml。

于 2014-09-16T06:47:10.940 回答
2

我在 Ubuntu 12.04 上遇到了同样的问题。

/var/log/nginx/error.log/在我看到的 nginx 错误日志 ( ) 中,

[ ... ]: [App 8509 stderr] /path/to/ruby_wrapper.sh: 2: /path/to/ruby_wrapper.sh: 
[ ... ]: [App 8509 stdout] 
[ ... ]: [App 8509 stderr] source: not found

/bin/sh好像没看懂source命令。因此,我将其更改为 simple .,它的作用相同。

完整的更改ruby_wrapper.sh如下所示:

#!/bin/sh

. /usr/local/etc/env
exec /home/rooby/.rvm/wrappers/ruby-1.9.3-p362@doorbells-dev/ruby "$@"

这对你有帮助吗?

于 2013-10-05T16:39:16.127 回答
-5

首先,使用

username: ENV["DB_USER"]
password: ENV["DB_PASSWORD"]
host: ENV["DB_HOST"]

反而

username: <%= ENV["DB_USER"] %>
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>
于 2013-08-22T05:12:42.803 回答