You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本:

  1. 在你的Rails项目根目录新建一个名为Procfile的文件(注意首字母大写,无后缀)
  2. 写入以下内容:
    web: bundle exec puma -C config/puma.rb
    
    这个命令会让EB通过bundle来启动Puma,自然就会使用你Gemfile.lock里锁定的3.11.0版本了。

方法二:通过.ebextensions修改EB的启动脚本

如果Procfile的方式不生效,你可以直接修改EB的部署钩子脚本,替换默认的Puma调用路径:

  1. 在项目根目录创建.ebextensions文件夹(如果还没有的话)
  2. 在里面新建一个配置文件,比如01_fix_puma_version.config
  3. 写入以下YAML配置:
    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
    
    这个脚本会在部署过程中替换EB默认的Puma启动命令,强制使用bundle里的版本。

验证是否生效

部署完成后,你可以登录到EC2实例里验证:

  1. 连接到实例后,进入应用目录(一般在/var/app/current)
  2. 运行bundle exec puma -v,看看输出的版本是不是3.11.0
  3. 也可以查看EB的日志,搜索启动命令,确认是不是用了bundle exec puma

为什么会出现这个问题?因为EB的Ruby平台预安装了一套默认的Puma版本(就是你碰到的2.16.0),它的启动脚本默认直接调用系统级的Puma,而不是通过bundle来加载项目依赖的版本。上面的两种方法都是强制EB使用项目bundle里的Puma,从根源解决依赖冲突。

内容的提问来源于stack exchange,提问作者Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:16:53