Rails 6.1 生产模式启动服务及迁移报解密错误如何解决
Rails 6.1 生产环境解密报错极简解决方案
报错核心根因
你遇到的 ActiveSupport::MessageEncryptor::InvalidMessage、底层抛出的 OpenSSL::Cipher::CipherError,和Web服务器、额外gem依赖没有任何关系:
- Rails 6.1 起默认将所有生产环境敏感配置(数据库密码、应用密钥、第三方凭证等)加密存储在
config/credentials.yml.enc文件中 - 不管是跑rake数据库任务,还是启动生产服务,Rails第一步都会先尝试用主密钥解密这个配置文件,解密失败就会直接抛出你遇到的两类错误
- 90%以上的同类报错,触发原因都是生产环境找不到和加密配置匹配的主密钥:
- 项目从开发机拷贝到部署环境时,因为
.gitignore默认忽略config/master.key文件,导致生产目录下根本没有这个文件 - 之前本地调整加密配置时更换了主密钥,提交了新的加密配置文件但没有同步对应的主密钥
- 手动设置的主密钥环境变量存在字符错误、长度不匹配
- 项目从开发机拷贝到部署环境时,因为
无复杂配置的解决步骤
整个过程不需要引入独立Web服务器、不需要额外安装gem,全部用Rails内置功能完成:
- 校准解密用的主密钥
- 回到最初开发这个项目的本地环境,打开
config/master.key文件(这是当初生成加密配置时自动生成的24位随机字符串) - 二选一完成主密钥配置:
- 把这个文件直接拷贝到生产环境项目的
config/目录下,保证当前运行服务的用户有读取权限即可 - 不想把密钥落盘的话,直接在当前shell会话设置环境变量:
export RAILS_MASTER_KEY=master.key里的完整字符串
- 把这个文件直接拷贝到生产环境项目的
- 回到最初开发这个项目的本地环境,打开
- 验证解密链路正常
先不要直接跑全量迁移,执行内置验证命令:RAILS_ENV=production rails credentials:show
能正常输出加密配置的明文内容,就说明解密环节完全打通,之前的解密报错会直接消失。 - 执行你原本需要的操作
- 数据库初始化/迁移命令现在可以正常执行:
RAILS_ENV=production rake db:create db:migrate db:seed - 按照你的需求直接指定端口启动生产模式服务(Rails 6.1默认内置了Puma服务器,不需要额外安装配置):
rails s -e production -p 指定的端口号
- 数据库初始化/迁移命令现在可以正常执行:
补充小提示:Rails生产模式默认会托管public目录下的静态文件,启动前如果项目有前端资源,跑一次内置的
RAILS_ENV=production rails assets:precompile编译静态资源即可,不需要额外配置。你之前看到的要求配Nginx、守护进程、复杂环境变量的教程,都是面向长期公网部署的场景,和你现在临时验证生产模式运行的需求完全不匹配,不需要照搬。
内容的提问来源于stack exchange,提问作者MrSolarius
相关产品推荐
相关产品推荐

