小さな星がほらひとつ

読者です 読者をやめる 読者になる 読者になる

Rails4.2 + PushionPassengerで「SECRET_KEY_BASE」に関するエラーが出た

プログラミング プログラミング-rails
スポンサーリンク

Rails4.2+passenger+apacheの環境でプロジェクトを作り本番(production)にデプロイ、アクセスしたらエラーになってしまった備忘録。

環境

CentOS 6.2、Apache2.2、PushionPassenger5.0、Rails4.2

apache起動時にエラーが発生

apacheのエラーログにこんなメッセージが。

App 3303 stderr: [ 2016-02-28 09:35:17.3257 3416/0x007f33ccd16328(Worker 1) utils.rb:68 ]: *** Exception RuntimeError in Rack application object 
(Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`) (process 3416, thread 
0x007f33ccd16328(Worker 1)):

何やら「production環境向けの"secret_token"と"secret_key_base"が無い、"config/secrets.yml"を見ろ」と言われている。

…何それ?

secrets.yml

developmentは問題無かったよな〜、と思いながらconfig/secrets.ymlを覗いてみます。

#config/secrets.yml

development:
  secret_key_base: xxxxxxxxxx.......
test:
  secret_key_base: yyyyyyyyyy........

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

secrets.ymlはRails4.1からrails newで自動生成されるファイル。
アプリケーションのシークレット値のほか、APIキーを管理するときなどに使う(らしい)。

Ruby on Rails 4.1 Release Notes — Ruby on Rails Guides


それで、developmentとtest向けにはrails newした時に勝手に値が入っているが、produciton向けには"SECRET_KEY_BASE"という環境変数の値を設定するようになっている。
つまり、productionでrailsアプリを動かすためには、この環境変数を設定してその値をpassengerへ渡す必要があるようです。

Rails 4.1 の secret.yml とは… - ARCHIVESDRIVE HD

ちなみにRails4.0以前では、config/initializers/secret_token.rbの中で、secretの値を設定していたようです。

#config/initializers/secret_token.rb

AppName::Application.config.secret_token = 'xxxxxxxxxx........'

producitonでの対応

ということで、secrets.ymlの中身に従いproduction向けのsecret_key_baseを生成します。
secret_key_baseを生成するためのrakeが用意されているようです。

bundle exec rake secret
xxxxxxxxxx.........

#これを環境変数に設定
export SECRET_KEY_BASE=xxxxxxxxxxx........

Rails が production 環境で真っ白、SECRET_KEY_BASE 設定忘れが原因でした | EasyRamble


環境変数に設定するのではなく、httpd.confでsetEnvする方法もあるようです。
Passenger + ApacheでのRails4のSECRET_KEY_BASEの設定方法 - QA@IT

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)