如何解决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
相关产品推荐
相关产品推荐

