rails production secret_key的设置
问题: app error: Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`
rails的安全机制需要一个秘钥。在rails 4.x版本的时候, 秘钥的设置在 RAILS_ROOT/config/secrets.yml, 这文件一般形如:
development: secret_key_base: xxxxxx test: secret_key_base: xxxxxx # Do not keep production secrets in the repository, # instead read values from the environment. production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
在非生产环境下, 秘钥都是'明文', '硬编码', 写在secrets.yml 里面的。这种方式会由于源代码的泄露, 造成安全问题, 所以这种方式存在安全隐患。
所以rails要求在生产环境下, 通过操作系统的环境变量来设置秘钥, 这样相对比较稳妥。
这里可以采取2种方法:
1. 自己动手, 利用linux系统的机制来设置环境变量 SECRET_KEY_BASE = XXX
2. 使用GEM dotenv-deployment帮你设置, 具体机制和方法1本质没区别。
ps: rails产生秘钥的指令: rake secret RAILS_ENV=production, 会产生一个秘钥(好尼玛长)
这里我选择方法2, 利用/etc/profile.d/ 下面添加脚本的方式来设置秘钥:
rake secret RAILS_ENV=production 产生一个秘钥
在目录 /etc/profile.d/xxx.sh, 下面新建一个 st_rails_secret_key_env.sh
脚本, 内容: export SECRET_KEY_BASE='你前面产生的那个秘钥'
然后刷新你的shell, echo $SECRET_KEY_BASE, 输出成功
extra:
linux下面设置环境变量的方法:
1. 两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效
2. /etc/profile.d/比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d/下对应的shell脚本即可,不用像/etc/profile需要改动此文件
参考链接:
http://stackoverflow.com/questions/23726110/missing-production-secret-key-base-in-rails
http://snakelab.cc/2014/11/08/ror-production.html