Rails 5生产环境secrets.yml中Recaptcha密钥识别错误求助
解决生产环境Recaptcha无法读取secrets.yml密钥的问题
碰到过好几个同行遇到这个生产环境Recaptcha密钥读不到的问题,结合Rails部署的常见坑,给你几个针对性的解决方案,应该能帮你搞定:
1. 先确认secrets.yml的生产环境配置格式是否正确
YAML对缩进和格式要求特别严,首先检查你的config/secrets.yml里生产环境的密钥结构必须是这样:
production: recaptcha_site_key: '你的生产环境Site Key' recaptcha_secret_key: '你的生产环境Secret Key'
注意:
- 用空格缩进(别用制表符),层级要对齐
- 密钥必须和Google Recaptcha控制台生成的生产环境专用密钥完全一致,别不小心把开发环境的密钥放进去了
2. 检查Capistrano部署时secrets.yml是否被正确同步
大部分人都会把secrets.yml加入.gitignore(这是正确的安全做法),但Capistrano默认不会上传git忽略的文件。你需要:
- 手动把生产环境的secrets.yml传到服务器的
shared/config目录下 - 在
config/deploy.rb里添加软链接配置:
append :linked_files, "config/secrets.yml"
这样每次部署时,Capistrano会自动把shared目录下的secrets.yml软链接到当前部署版本的config目录,确保生产环境能读取到正确的配置文件。
3. 别在secrets.yml里用export(除非你改用环境变量配置)
你之前尝试的export是shell环境变量的写法,但secrets.yml是YAML文件,这种写法完全无效。如果想改用更安全的环境变量方式配置(生产环境推荐),可以这么做:
- 在服务器层面设置环境变量:比如在
/etc/profile或者Nginx的server配置块里添加:
env RECAPTCHA_SITE_KEY=你的生产Site Key; env RECAPTCHA_SECRET_KEY=你的生产Secret Key;
添加后记得重启Nginx生效。
- 然后在secrets.yml里引用环境变量:
production: recaptcha_site_key: <%= ENV['RECAPTCHA_SITE_KEY'] %> recaptcha_secret_key: <%= ENV['RECAPTCHA_SECRET_KEY'] %>
4. 验证生产环境配置是否真的加载成功
登录到服务器,进入当前部署的应用目录,运行以下命令检查Recaptcha配置:
RAILS_ENV=production rails c > Rails.application.secrets.recaptcha_site_key
如果返回nil或者错误的密钥,说明配置没加载对,回到前面的步骤排查;如果返回正确密钥,那要检查Recaptcha的初始化文件(比如config/initializers/recaptcha.rb)是否正确引用了配置:
Recaptcha.configure do |config| config.site_key = Rails.application.secrets.recaptcha_site_key config.secret_key = Rails.application.secrets.recaptcha_secret_key end
确保这里的键名和你secrets.yml里的完全一致。
5. 检查应用服务器的环境变量传递
如果用Passenger或Puma作为应用服务器,要确保它们能读取到服务器的环境变量:
- 若是Passenger,在Nginx配置里添加:
passenger_env_var RECAPTCHA_SITE_KEY 你的生产Site Key; passenger_env_var RECAPTCHA_SECRET_KEY 你的生产Secret Key;
- 若是Puma,推荐在服务器层面配置环境变量,不要直接写在
config/puma.rb里(避免密钥泄露),如果一定要写,就加:
ENV['RECAPTCHA_SITE_KEY'] = '你的生产Site Key' ENV['RECAPTCHA_SECRET_KEY'] = '你的生产Secret Key'
内容的提问来源于stack exchange,提问作者German
相关产品推荐
相关产品推荐

