【问题标题】:rails secret_key_base not being recognized in productionrails secret_key_base 在生产中未被识别
【发布时间】:2014-05-23 15:29:00
【问题描述】:

所以我正在尝试在生产中部署我的 rails 应用程序。当我转到该页面时,我收到 500 错误。当我转到我的错误日志时,我收到以下错误:

Exception RuntimeError in Rack application object (Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`) 

我正在运行 Rails 4.1,我的 config/secrets.yml 看起来像这样:

    development:
      secret_key_base: <development key>        
    test:
      secret_key_base: <test key>

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

我运行 rake secret 来获取密钥并将导出文件放入我的 bash_profile 并获取它。我运行了 rake assets:precompile 成功。但是我仍然不断收到此错误。有什么想法吗?

更新:我尝试更新提供的错误消息以提供更好的信息......但消息没有更新。然后我尝试将密钥直接添加到 yml 文件中,而不是使用环境变量,但仍然没有骰子。我在 hostmonster 上运行,所以我无法重新启动服务器.....但是有些东西告诉我这就是需要做的......

更新 2:睡了一夜之后,这个问题似乎不再是问题了。它一定是某种缓存。现在我的问题是它试图使用我几天前为我的数据库更改的旧配置。如果我弄清楚如何使缓存无效,我会将其发布在这里并将其标记为答案。如果其他人知道该怎么做,请告诉我,我会将其标记为答案。我使用 HostMonster 作为我的主机,并按照他们在其网站上的步骤来托管我的 rails 应用程序。

【问题讨论】:

    标签: ruby-on-rails ruby rake


    【解决方案1】:
    1. 您需要重新启动服务器,因为在YourAppName::Application.initialize! 调用config/environment.rb 之后,您无法更改您的设置。
    2. 检查您的 yml 标记,可能有一些错误
    3. 您的 config/initializers/secret_token.rb 中可能有问题

    问题不在于 ENV 伪散列。如果在 ENV 中没有这样的密钥,secret_key_base 将为 nil。

    【讨论】:

    • 我正在使用 Hostmonster 来托管这个应用程序(共享主机)....如何重新启动我的服务器?
    • 另外,在 4.1 中没有 config/initializers/secret_token.rb。现在只有一个 config/secrets.yml 我把它贴在上面
    • 检查您的部署设置。可能您需要在linked_files 中指定config/secrets.yml(如果您使用capistrano,则如database.yml)
    • 我没有使用 capistrano。使用 hostmonster,您只需设置一个带有一些乘客配置的 .htaccess 文件,然后它就可以工作了。我已经让它与设置为“开发”的环境一起工作,但是当我切换到“生产”时,它给我带来了问题,错误如上。
    • 您实际上是正确的。为了将来重新启动 hostmonster 乘客服务器的参考,只需从您的应用程序基目录运行 touch tmp/restart.txt。一旦我这样做了,它就会获取我的新信息。谢谢!
    【解决方案2】:

    我遇到了同样的问题,我解决了创建一个环境变量以在我每次登录生产服务器时加载并让a mini guide of the steps 自行配置它:

    所以我将 Rails 4.1 与 Unicorn v4.8.2 一起使用,当我尝试部署我的应用程序时,它无法正常启动并进入 unicorn.log 文件,我发现此错误消息:

    应用程序错误:“生产”环境缺少secret_key_base,请在config/secrets.yml 中设置此值(运行时错误)

    经过一番研究,我发现 Rails 4.1 改变了管理 secret_key 的方式,所以如果我们阅读位于 exampleRailsProject/config/secrets.ymlsecrets.yml 文件(您需要将“exampleRailsProject”替换为您的项目名称),您会发现像这样:

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

    这意味着 Rails 建议您在我们的生产服务器中为 secret_key_base 使用环境变量,因此为了解决此错误,您需要按照以下步骤为 linux 创建环境变量(在我的情况下是 Ubuntu ) 在我们的生产服务器中:

    1.- 在我们生产服务器的终端中,您将执行下一条命令:

    $ RAILS_ENV=production rake secret
    

    这将给出一个包含字母和数字的大字符串,这是您需要的,所以复制它(我们将该代码称为 GENERATED_CODE)。

    2.1- 现在,如果我们以 root 用户身份登录到我们的服务器,我们需要找到这个文件并打开它:

    $ vi /etc/profile
    

    然后我们转到文件底部(“SHIFT + G”表示VI中的大写G)

    我们将使用我们的GENERATED_CODE写入我们的环境变量(在VI中按“i”键写入),请确保在文件末尾的新行中:

    export SECRET_KEY_BASE=GENERATED_CODE
    

    编写完代码后,我们保存更改并关闭文件(我们按下“ESC”键,然后在 VI 中输入“:x”和“ENTER”键保存并退出)

    2.2 但是,如果我们以普通用户身份登录,让我们将其命名为 example_user 作为这个要点,我们将需要找到其他文件之一:

    $ vi ~/.bash_profile
    $ vi ~/.bash_login
    $ vi ~/.profile
    

    这些文件是按重要性排列的,这意味着如果你有第一个文件,那么你就不需要写其他文件了。因此,如果您在目录“~/.bash_profile”和“~/.profile”中找到这两个文件,您只需写入第一个“~/.bash_profile”,因为 linux 只会读取这个和另一个将被忽略。

    然后我们转到文件底部(“SHIFT + G”表示VI中的大写G)

    我们将使用我们的GENERATED_CODE写入我们的环境变量(在VI中按“i”键写入),请确保在文件末尾的新行中:

    export SECRET_KEY_BASE=GENERATED_CODE
    

    编写完代码后,我们保存更改并关闭文件(我们按下“ESC”键,然后在 VI 中输入“:x”和“ENTER”键保存并退出)

    3.-我们可以用这个命令来验证我们的环境变量在linux中是否正确设置:

    $ printenv | grep SECRET_KEY_BASE
    

    或与:

    $ echo $SECRET_KEY_BASE
    

    当您执行此命令时,如果一切正常,它将显示我们之前生成的 GENERATED_CODE。最后,完成所有配置后,您可以毫无问题地使用 Unicorn 或其他方式部署 Rails 应用程序。

    现在,当您关闭 shell 终端并再次登录生产服务器时,您将设置此环境变量并准备好使用它。

    就是这样!!我希望这个迷你指南可以帮助您解决这个错误。

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 2014-07-06
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2013-01-19
      相关资源
      最近更新 更多