rails secret_key_base未在生产中被识别

所以我正在尝试在生产中部署我的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:  test: secret_key_base:  # Do not keep production secrets in the repository, # instead read values from the environment. production: secret_key_base:  

我运行rake secret获取密钥并将导出放入我的bash_profile并获取它。 我运行了rake资产:预编译成功。 但我仍然一直在犯这个错误。 有任何想法吗?

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

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

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

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

我有同样的问题,我解决了创建一个环境变量,每次我登录到生产服务器时加载,并制作一个迷你指南,由我自己在我的要点配置它的步骤:

https://gist.github.com/pablosalgadom/4d75f30517edc6230a67

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

“app error:缺少’production’环境的secret_key_base ,在config/secrets.yml (RuntimeError)中设置此值”

经过一番研究后我发现Rails 4.1改变了管理secret_key的方式,所以如果我们读取位于exampleRailsProject / config / secrets.yml的secrets.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

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

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

 export SECRET_KEY_BASE=GENERATED_CODE 

写完代码后我们保存更改并关闭文件(我们按“ESC”键然后写“:x”和“ENTER”键进行保存并退出VI)

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

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

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

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

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

 export SECRET_KEY_BASE=GENERATED_CODE 

写完代码后我们保存更改并关闭文件(我们按“ESC”键然后写“:x”和“ENTER”键进行保存并退出VI)

3.-我们可以使用以下命令validation我们的环境变量是否在linux中正确设置:

 $ printenv | grep SECRET_KEY_BASE 

或者:

 $ echo $SECRET_KEY_BASE 

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

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

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