2014-04-10 46 views
6

所以我试图在生产环境中部署我的rails应用程序。当我进入页面时,我得到一个500错误。当我去我的错误日志我得到以下错误:rails secret_key_base在生产中不被识别

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

我运行的Rails 4.1和我的配置/ 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"] %> 

我跑耙秘密来获得键,并将导出放入我的bash_profile中并找到它。我运行了rake资源:预编译成功。但我仍然不断收到这个错误。有任何想法吗?

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

更新2:睡了一夜后,似乎这个问题是没有更长的问题。它一定是某种缓存。现在我的问题是,它试图使用我的数据库前几天改变的旧配置。如果我弄清楚如何取消缓存,我会在这里发布它并将其标记为答案。如果别人知道如何做,请让我知道,我会将其标记为答案。我使用HostMonster作为我的托管服务器,并遵循他们在其网站上托管我的Rails应用程序的步骤。

回答

5
  1. 您需要重新启动您的服务器,因为YourAppName::Application.initialize!称为config/environment.rb后不能更改设置。
  2. Checkout的阳明标记,可能存在一定的误差
  3. 可能出错在你的配置/初始化/ secret_token.rb

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

+0

我正在使用Hostmonster来托管这个应用程序(共享主机)....我如何重新启动我的服务器? –

+1

另外,在4.1中没有config/initializers/secret_token.rb。现在只有一个配置/ secrets.yml,我发布上面 –

+1

检查您的部署设置。可能你需要在linked_files中指定config/secrets.yml(如果你正在使用capistrano,就像database.yml) –

5

我有同样的问题,我解决了创建一个环境变量每次我登录到生产服务器的时间来加载和制作的步骤的微型导轨由你自己在我的要点进行配置:

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

,所以我使用Rails 4.1与独角兽v4.8.2,当我试图部署我的应用程序就不能正常启动,并进入unicorn.log文件,我发现这个错误消息:

“应用程序错误:'生产'环境缺少secret_key_base,请将此值设置为config/secrets.yml(RuntimeError)“

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

这意味着轨道建议您使用环境变量在我们的生产服务器的secret_key_base,所以为了要解决这个错误,您需要按照以下步骤在我们的生产服务器上为Linux创建环境变量(在我的情况下,它是Ubuntu):

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

$ RAILS_ENV=production rake secret 

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

2.1-现在,如果我们用root用户登录到我们的服务器,我们需要找到这个文件并打开它: $ VI/etc/profile文件

然后我们去到文件底部(“SHIFT + G“代替大写字母G)

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

export SECRET_KEY_BASE=GENERATED_CODE 

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

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

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

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

然后我们去到文件底部(“Shift + G”资本的G VI)

,我们会写我们的环境变量,我们GENERATED_CODE(按“I”键,在VI写) ,一定要在一个新的生产线在文件的结尾:

export SECRET_KEY_BASE=GENERATED_CODE 

写好我们保存更改并关闭该文件的代码(我们按“ESC”键,然后写上“:x”和“ENTER”键保存并退出VI)

3.我们可以验证我们的环境变量是prope在linux RLY设置使用此命令:

$ printenv | grep SECRET_KEY_BASE 

或:

$ echo $SECRET_KEY_BASE 

当你执行这个命令,如果一切正常,它会告诉你,我们之前所产生的GENERATED_CODE。最后,在完成所有配置后,您可以毫无问题地使用Unicorn或其他配置部署Rails应用程序。

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

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