【问题标题】:SemiFixed: Missing `secret_key_base` for 'production' environment半固定:“生产”环境缺少“secret_key_base”
【发布时间】:2014-06-23 10:59:46
【问题描述】:

我从头开始创建了一个 Rails 应用程序(Rails 4.1.0),但遇到了一个我无法解决的问题。我已经安装并配置了 Apache 乘客模块,它工作正常。每当我尝试访问虚拟主机时,都会收到错误 500:

Missing secret_key_base for 'production' environment, set this value in config/secrets.yml

secret.yml 文件包含以下配置:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

即使不推荐我这样做:

    production:
  secret_key_base: XXXXXXXXXXXXXXXXXXXXXXXXXXXX (random key)

但 Apache 日志显示:

# tailf /etc/httpd/logs/error_log
[Tue May 06 12:56:18 2014] [error] [client 192.168.3.1] Premature end of script headers:
App 4405 stderr: [ 2014-05-06 12:56:18.5763 4421/0x9d48bdc(Worker 1) utils.rb:68 ]: *** Exception RuntimeError in Rack application object (Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`) (process 4421, thread 0x9d48bdc(Worker 1)):
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/railties-4.1.0/lib/rails/application.rb:440:in `validate_secret_key_config!'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/railties-4.1.0/lib/rails/application.rb:195:in `env_config'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/railties-4.1.0/lib/rails/engine.rb:510:in `call'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/railties-4.1.0/lib/rails/application.rb:144:in `call'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.41/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.41/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.41/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
App 4405 stderr:        from /usr/local/rvm/gems/ruby-2.1.1/gems/passenger-4.0.41/lib/phusion_passenger/request_handler.rb:448:in `block (3 levels) in start_threads'

我该如何解决这个错误?如何访问开发环境?我的意思是如何编写代码、在浏览器中进行测试然后部署到 Heroku 或仅在生产环境中进行测试?

更新

我设法通过在 VirtualHost 上设置 RailsEnv development 来修复上述错误,但现在我得到了另一个错误:

SQLite3::CantOpenException 无法打开数据库文件 Rails.root: /var/www/html/moviedb

我正在尝试使用this GEM 对 TheMovieDB 网站进行查询并获得结果。对这个新错误有何建议?

【问题讨论】:

  • 您从 YAML 发布的摘录没有正确缩进。是粘贴中的错误吗? YAML 对缩进非常敏感 - secret_key_base: 应该比 production: 缩进两个空格。
  • 您知道使用 ENV["SECRET_KEY_BASE"] 正在寻找名为 SECRET_KEY_BASE 的系统环境变量。如果你可以 ssh 到主机上,那么 rails 目录中的SECRET_KEY_BASE=`rake secret` 应该设置它。要检查它是否有效,您可以echo $SECRET_KEY_BASE 注意:如果您直接在配置文件中设置,这可能不是问题。

标签: ruby-on-rails ruby heroku ruby-on-rails-4


【解决方案1】:

通过 bash 实现的 Rails 应用密钥

如果您有权访问运行 rails 应用程序的用户bashconsole,并且如果您没有使用thin,那么您可以通过用户提供环境变量~/.bashrc

只需添加以下内容:

export SECRET_KEY_BASE=`MY_SECRET_KEY`

注意:MY_SECRET_KEY 可以是任何值,但在 bash 控制台上使用 rake secret 生成密钥是安全的,将 该密钥 替换为示例中的“MY_SECRET_KEY”。

完成此操作后,您应该会在 hash 中看到一个 SECRET_KEY_BASE 变量,当您在 Rails 控制台中调用 ENV 时会返回该变量。

最后但同样重要的是,重新启动您的 rails 应用程序,错误应该会消失。

每个 rbenv-vars 的 Rails 应用密钥

此外,如果您使用的是rbenv,则可以使用rbenv-vars 插件来获得每个rails 应用程序密钥环境变量。

here!

使用上帝(godrb.com):感谢 hlcs

你需要god terminate然后重新开始。

【讨论】:

  • 对于那些使用god的人,你需要终止上帝(god terminate)然后重新开始。
【解决方案2】:

我做了什么:在我的生产服务器上,我为 Thin(我正在使用它)创建一个配置文件 (confthin.yml) 并添加以下信息:

环境:生产 用户:www-数据 组: www-数据 SECRET_KEY_BASE: mysecretkeyproduction

然后我启动应用程序

thin start -C /whereeveristhefieonprod/configthin.yml

像魅力一样工作,然后不需要在版本控制上拥有密钥

希望它能有所帮助,但我相信 Unicorn 和其他人也可以做到这一点。

【讨论】:

  • 我收到错误gems/thin-1.7.0/lib/thin/runner.rb:147:in `parse!': invalid option: --SECRET-KEY-BASE=&lt;key&gt; (OptionParser::InvalidOption)
【解决方案3】:

我用这个解决了类似的情况(可能只在类似 Ubuntu 的环境中有用)。请参阅:Missing secret key base for production environment。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2016-11-05
    • 2017-05-03
    • 2017-03-31
    • 2014-06-04
    • 2014-07-06
    • 2015-07-12
    相关资源
    最近更新 更多