我的数据库。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/地方/etc/env
export RAILS_ENV=production
export DB_PASSWORD= (snip)
export DB_USER=doorbells
/usr/地方/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;
我重新启动了服务器,但无济于事。什么好主意吗?
我在Ubuntu 12.04上遇到了同样的问题。
在nginx错误日志(/var/log/nginx/error.log/
)我看到,
[ ... ]: [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
的命令。因此,我将其更改为简单的.
,其功能相同。
修改后的ruby_wrapper.sh
如下所示:
#!/bin/sh
. /usr/local/etc/env
exec /home/rooby/.rvm/wrappers/ruby-1.9.3-p362@doorbells-dev/ruby "$@"
这对你有帮助吗?
以上解决方案对我不起作用。然而,我找到了解决方案如何在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标记时,它更像是动词模板。因此,首先将其作为一个动词模板读取,然后像上面那样加载yml。
首先使用
username: ENV["DB_USER"]
password: ENV["DB_PASSWORD"]
host: ENV["DB_HOST"]
而不是username: <%= ENV["DB_USER"] %>
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>