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

如何解决Rails5应用在Elastic Beanstalk中webpack资源404问题?

解决Rails 5部署Elastic Beanstalk后Webpack打包资源404问题

嘿,我来帮你搞定这个EB上的Webpack资源404问题!毕竟Heroku和EB的静态资源处理逻辑差异不小,咱们一步步排查:

1. 给EB的Nginx加个packs目录映射

EB默认用Nginx作为反向代理,它可能没自动识别public/packs这个目录。你需要在项目根目录创建.ebextensions/assets.config文件,添加以下配置:

files:
  "/etc/nginx/conf.d/00_assets.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      location /packs {
        alias /var/app/current/public/packs;
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }

这个配置会告诉Nginx,当请求/packs路径下的资源时,直接去实例上的/var/app/current/public/packs目录找,同时开启gzip和缓存优化。

2. 确认预编译产物真的被部署了

  • 本地执行RAILS_ENV=production bundle exec rails assets:precompile后,检查项目根目录的public/packs下有没有生成对应的js、css文件(比如application-xxxx.js这类带哈希的文件)。
  • 检查你的.gitignore文件,如果里面有public/packs这一行,EB部署时会忽略这个目录,导致实例上没有资源文件。你需要把这行删掉,或者手动把packs目录加入部署包。

3. 核对Webpacker.yml的生产环境配置

打开config/webpacker.yml,确认production环境的public_output_path设置正确,比如:

production:
  <<: *default
  public_output_path: packs
  # 其他保持默认即可,确保编译后的资源输出到public/packs

预编译时会用production环境的配置,路径错了自然找不到资源。

4. 验证EB实例上的文件路径

你可以通过EB控制台的“实例”页面,SSH到运行中的实例,然后执行:

ls /var/app/current/public/packs

如果输出为空,说明预编译没执行或者产物没上传:

  • 检查RAILS_SKIP_ASSET_COMPILATION是否真的设为false(可以在EB的环境变量里确认)。
  • 也可以在.ebextensions里加一个部署脚本,强制执行预编译:
commands:
  01_precompile_assets:
    command: "bundle exec rails assets:precompile RAILS_ENV=production"
    cwd: "/var/app/ondeck"

5. 检查asset_host配置

如果你的config/environments/production.rb里设置了config.action_controller.asset_host,要确保它指向EB的正确域名,比如https://your-eb-app-name.elasticbeanstalk.com,否则资源请求会跳转到错误的地址。

先从Nginx配置和文件存在性这两点入手,这是EB和Heroku最核心的差异点,大概率能解决问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:14:58