无法将Rails 5.2应用部署至Elastic Beanstalk求助
搞定Rails 5.2部署Elastic Beanstalk失败的问题
我之前也踩过类似的坑,给你梳理几个关键排查点和解决办法:
一、先确认环境变量是不是真的传对了
你用eb create带参数的方式看起来没问题,但有时候变量传递可能会出小差错:
- 先确认
config/credentials.yml.enc已经提交到代码仓库了(这个文件不能丢,而master.key绝对不能提交,靠环境变量传是正确的做法) - 用
eb printenv命令看看当前EB环境里的变量,确认SECRET_KEY_BASE和RAILS_MASTER_KEY是不是都有正确的值。如果是空的或者不对,重新设置一遍:eb setenv SECRET_KEY_BASE=$(rails secret) RAILS_MASTER_KEY=$(cat config/master.key)
二、给EB加个专属配置文件
Rails 5.2在EB上跑需要一些额外配置来处理静态资源和服务器启动,你在项目根目录新建.ebextensions/rails.config文件,把下面内容贴进去:
option_settings: - option_name: RAILS_ENV value: production - option_name: BUNDLE_WITHOUT value: development test - option_name: RAILS_SERVE_STATIC_FILES value: true container_commands: 01_assets_precompile: command: bundle exec rails assets:precompile leader_only: true
这个配置主要做几件事:
- 强制环境为production
- 跳过开发和测试环境的gem,加快部署速度
- 让Rails直接处理静态文件(省得额外配置nginx的静态资源路径)
- 只在主节点预编译静态资源,避免多个实例重复干活浪费资源
三、检查Puma的配置有没有问题
Rails 5.2默认用Puma当服务器,EB对Puma的配置有要求,你看看config/puma.rb是不是类似下面这样:
workers Integer(ENV['WEB_CONCURRENCY'] || 2) threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5) threads threads_count, threads_count port ENV['PORT'] || 3000 environment ENV['RAILS_ENV'] || 'development' preload_app! on_worker_boot do ActiveRecord::Base.establish_connection if defined?(ActiveRecord) end
要是你的Puma配置路径不对,或者参数不合理,EB启动应用的时候会报错,这个默认配置基本能适配EB的环境。
四、扒完整日志找病根
你只提到了nginx日志的开头,光这点信息很难定位具体问题。建议用eb logs命令拉取所有日志,重点看这几个:
/var/log/puma/puma.log:这里会记录应用启动失败的具体原因,比如credentials解密失败、数据库连不上、gem依赖缺失之类的/var/log/nginx/error.log:看看nginx是不是连不上Puma的端口,或者静态资源找不到
五、确认Ruby版本匹配
Rails 5.2对Ruby版本有要求,至少2.2.2以上,推荐用2.5.x系列。你要确保Gemfile里指定的Ruby版本和EB环境用的一致:
- 在Gemfile开头加上
ruby '2.5.1'(替换成你实际用的版本),或者在.ruby-version文件里写清楚版本号 - 用
eb platform show看看当前EB平台的Ruby版本,如果不匹配,就用eb platform select选个合适的平台版本
内容的提问来源于stack exchange,提问作者brg
相关产品推荐
相关产品推荐

