生产环境中无法识别Rails的secret_key_base。

8

我正在尝试在生产环境部署我的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应用程序提供的步骤进行操作。
2个回答

6
我遇到了同样的问题,并通过创建一个环境变量来解决。每次登录到生产服务器时都会加载该变量。我制作了一个简易指南,以便自己配置:
我使用Rails 4.1和Unicorn v4.8.2。当我尝试部署我的应用程序时,它无法正常启动。在unicorn.log文件中,我发现了以下错误消息:
应用程序错误:缺少“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中使用SHIFT + G到达文件底部)

然后我们将用生成的代码写入环境变量(在VI中按“i”键开始输入),请确保在文件末尾处换行:

export SECRET_KEY_BASE=GENERATED_CODE

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

2.2 但如果我们以普通用户登录,假设我们称其为example_user,我们将需要找到其他文件之一:

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

这些文件按重要性排序,这意味着如果您拥有第一个文件,则不需要编写其他文件。因此,如果您在目录“〜/ .bash_profile”和“〜/ .profile”中找到了这2个文件,则只需要在第一个文件“〜/ .bash_profile”中编写,因为Linux仅读取此文件,而忽略另一个文件。
然后我们转到文件底部(在VI中按下“SHIFT + G”进行大写G)
然后我们将使用我们的GENERATED_CODE编写环境变量(在VI中按“i”键),请确保在文件末尾处处于新行中:
export SECRET_KEY_BASE=GENERATED_CODE

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

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

$ printenv | grep SECRET_KEY_BASE

或者使用:
$ echo $SECRET_KEY_BASE

当您执行此命令时,如果一切顺利,它将向您显示我们之前生成的GENERATED_CODE。最后,在完成所有配置后,您可以毫无问题地使用Unicorn或其他工具部署Rails应用程序。
现在,当您关闭Shell终端并再次登录到生产服务器时,您将拥有这个环境变量并准备好使用它。
这就是全部!我希望这个小指南能够帮助您解决这个错误。

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

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


我正在使用Hostmonster来托管这个应用程序(共享主机)...我该如何重新启动我的服务器? - Bill Garrison
1
另外,在4.1版本中,没有config/initializers/secret_token.rb文件。现在只有一个config/secrets.yml文件,我已经发布了它的内容。 - Bill Garrison
1
请检查您的部署设置。可能需要在linked_files中指定config/secrets.yml(如果您正在使用capistrano,则类似于database.yml)。 - Mihail Davydenkov
我没有使用Capistrano。在HostMonster上,你只需要设置一个带有一些Passenger配置的.htaccess文件,然后就可以运行了。我已经设置好了环境为"development",但当我切换到"production"时,出现了问题,错误就像上面所述。 - Bill Garrison
你说得对。以后如果需要重启Hostmonster Passenger服务器,只需从应用程序基目录运行touch tmp/restart.txt即可。我这样做后,它就能获取到我的新信息了。谢谢! - Bill Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接