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

部署Rails 5.1(Puma)至Amazon EBS后图片无法显示求助

Rails 5.1 + Puma 部署AWS生产环境图片不显示问题排查方案

我来帮你梳理下这个常见的生产环境静态资源坑,咱们一步步排查解决:

1. 确认预编译操作是否正确执行

  • 首先要确保是在生产环境上下文中执行预编译,命令应该是:
    RAILS_ENV=production bundle exec rake assets:precompile
    
    很多时候漏加RAILS_ENV=production会导致资源预编译到开发环境目录,生产环境根本读不到。
  • 登录AWS服务器,检查public/assets目录下是否存在带哈希后缀的图片文件(比如avatar-789abc.png)。如果没有,说明预编译过程出错了,查看预编译时的终端输出找报错信息。

2. 检查Rails生产环境静态资源配置

  • 在config/environments/production.rb中,确认config.serve_static_files(Rails 5.1版本的配置项,后续版本改为config.public_file_server.enabled)设置为true:
    config.serve_static_files = true
    
    Puma本身默认不处理静态文件请求,开启这个配置才能让Rails在生产环境中返回静态资源;如果是用Nginx反向代理,也可以让Nginx直接处理public/assets的请求,性能会更好。
  • 生产环境建议把config.assets.compile改回false,这个配置设为true会实时编译资源,严重影响生产环境性能,只有预编译完全正确的情况下才需要关闭。

3. 确保图片引用方式正确

  • 视图中引用图片必须使用Rails的asset helper,比如:
    <%= image_tag('profile.png') %>
    
    不要直接写死路径<img src="/assets/profile.png">,因为预编译后图片会添加哈希后缀,asset helper会自动生成正确的带哈希的URL。
  • CSS/SCSS中的图片引用,要使用Sass的asset helper:
    .banner {
      background-image: image-url('banner-bg.png');
    }
    
    避免用原生的url('/assets/banner-bg.png'),否则预编译时无法替换成正确的哈希路径。

4. AWS环境专属配置检查

  • 如果你的静态资源托管在S3上,要确认config/environments/production.rb中的config.asset_host设置正确:
    config.asset_host = 'https://your-bucket-name.s3.amazonaws.com'
    
    同时检查S3桶的权限,确保静态资源文件设置了公开读取权限,否则浏览器请求会被拒绝。
  • 如果是EC2直接部署,检查EC2安全组和服务器防火墙,确保80/443端口开放,允许外部请求访问静态资源。

5. 清理缓存后重新预编译

  • 旧的预编译缓存可能导致冲突,先清理旧资源:
    RAILS_ENV=production bundle exec rake assets:clean
    
  • 然后重新执行预编译,最后重启Puma服务器:
    # 假设你用systemd管理Puma,重启命令示例
    sudo systemctl restart puma
    

你可以按照上面的步骤逐一排查,优先检查预编译文件是否存在、静态资源服务是否开启这两个最常见的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:31:07