部署Rails 5.1(Puma)至Amazon EBS后图片无法显示求助
Rails 5.1 + Puma 部署AWS生产环境图片不显示问题排查方案
我来帮你梳理下这个常见的生产环境静态资源坑,咱们一步步排查解决:
1. 确认预编译操作是否正确执行
- 首先要确保是在生产环境上下文中执行预编译,命令应该是:
很多时候漏加RAILS_ENV=production bundle exec rake assets:precompileRAILS_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:
Puma本身默认不处理静态文件请求,开启这个配置才能让Rails在生产环境中返回静态资源;如果是用Nginx反向代理,也可以让Nginx直接处理config.serve_static_files = truepublic/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设置正确:
同时检查S3桶的权限,确保静态资源文件设置了公开读取权限,否则浏览器请求会被拒绝。config.asset_host = 'https://your-bucket-name.s3.amazonaws.com' - 如果是EC2直接部署,检查EC2安全组和服务器防火墙,确保80/443端口开放,允许外部请求访问静态资源。
5. 清理缓存后重新预编译
- 旧的预编译缓存可能导致冲突,先清理旧资源:
RAILS_ENV=production bundle exec rake assets:clean - 然后重新执行预编译,最后重启Puma服务器:
# 假设你用systemd管理Puma,重启命令示例 sudo systemctl restart puma
你可以按照上面的步骤逐一排查,优先检查预编译文件是否存在、静态资源服务是否开启这两个最常见的原因。
内容的提问来源于stack exchange,提问作者Zekarias Zico
相关产品推荐
相关产品推荐

