Rails技术问题:如何为AWS Elastic Beanstalk应用获取Puma 3.11?
解决Elastic Beanstalk忽略Gemfile.lock中Puma版本的问题
我之前也踩过EB这个坑!它默认会用平台预安装的旧版Puma,完全不管你Gemfile.lock里的指定版本,确实会搞出依赖冲突。针对你这个搭载Ruby 2.3的Puma/Amazon Linux 2.4.4环境,给你几个靠谱的解决办法:
方法一:用Procfile指定启动命令(最推荐)
EB会优先读取项目根目录的Procfile来启动应用,我们可以在这里强制使用bundle里的Puma版本:
- 在你的Rails项目根目录新建一个名为
Procfile的文件(注意首字母大写,无后缀) - 写入以下内容:
这个命令会让EB通过bundle来启动Puma,自然就会使用你Gemfile.lock里锁定的3.11.0版本了。web: bundle exec puma -C config/puma.rb
方法二:通过.ebextensions修改EB的启动脚本
如果Procfile的方式不生效,你可以直接修改EB的部署钩子脚本,替换默认的Puma调用路径:
- 在项目根目录创建
.ebextensions文件夹(如果还没有的话) - 在里面新建一个配置文件,比如
01_fix_puma_version.config - 写入以下YAML配置:
这个脚本会在部署过程中替换EB默认的Puma启动命令,强制使用bundle里的版本。container_commands: 01_replace_puma_exec: command: | sed -i 's/\/usr\/local\/bin\/puma/bundle exec puma/' /opt/elasticbeanstalk/hooks/appdeploy/enact/00_copy_config.sh
验证是否生效
部署完成后,你可以登录到EC2实例里验证:
- 连接到实例后,进入应用目录(一般在
/var/app/current) - 运行
bundle exec puma -v,看看输出的版本是不是3.11.0 - 也可以查看EB的日志,搜索启动命令,确认是不是用了
bundle exec puma
为什么会出现这个问题?因为EB的Ruby平台预安装了一套默认的Puma版本(就是你碰到的2.16.0),它的启动脚本默认直接调用系统级的Puma,而不是通过bundle来加载项目依赖的版本。上面的两种方法都是强制EB使用项目bundle里的Puma,从根源解决依赖冲突。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

