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 ファイルにハードコーディングすると、サーバーは正しく起動します。

パスワードなしで「root」としてログインしようとしていると MySQL が主張し続けるため、環境変数を正しく設定していないと思われます。最初は .bashrc ファイルからエクスポートしていましたが、この質問を読んだ後、これは適切な方法ではないことに気付きました。いろいろ調べたところ、たまたまこのブログ投稿にたどり着いたので、指示に従って次の 3 つのファイルを作成しました。

/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

I had the very same problem on Ubuntu 12.04.

In the nginx error log (/var/log/nginx/error.log/) I've seen, that

[ ... ]: [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 seems to don't understand the source command. Thus, I've changed it to a simple ., which does the same.

The complete changed ruby_wrapper.sh would look like:

#!/bin/sh

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

Does this help for you?

于 2013-10-05T16:39:16.127 に答える
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 に答える
-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 に答える