生产环境Docker部署Rails Admin渲染异常缓慢,疑资产未编译?
我在生产环境用Docker部署了搭配Rails API的Rails Admin,现在遇到页面渲染异常缓慢的问题,简单页面加载耗时长达15秒,看起来是布局渲染环节耗时极久。请问是否是因为我在Docker构建流程中遗漏了资产编译步骤导致的?
日志详情:
User Load (18.8ms) SELECT "users".* FROM "users" ORDER BY users.id desc LIMIT $1 OFFSET $2 [["LIMIT", 20], ["OFFSET", 0]] (20.8ms) SELECT COUNT(*) FROM "users" Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/rails_admin/main/index.html.haml within layouts/rails_admin/application (Duration: 1559.2ms | Allocations: 49878) Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/_head.html.haml (Duration: 0.5ms | Allocations: 190) Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/_secondary_navigation.html.haml (Duration: 0.5ms | Allocations: 269) Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/_navigation.html.haml (Duration: 3.2ms | Allocations: 469) Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/_sidebar_navigation.html.haml (Duration: 35.2ms | Allocations: 17042) Rendering /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/pjax.html.haml Rendered /usr/local/bundle/gems/rails_admin-2.0.2views/layouts/rails_admin/pjax.html.haml (Duration: 12.1ms | Allocations: 1683) Completed 200 OK in 2302ms (Views: 1590.1ms | ActiveRecord: 120.6ms | Allocations: 77826)
大概率就是你遗漏了资产预编译步骤导致的!生产环境下Rails不会默认动态编译资产,而Rails Admin依赖大量的CSS、JS资产,如果没预编译,每次请求页面时服务器都要临时编译这些资产,直接导致布局渲染耗时飙升——你日志里布局渲染占了1.5秒,这在预编译完成的生产环境里完全不正常。
给你几个具体的排查和解决步骤:
检查Dockerfile是否包含资产预编译命令
生产环境构建镜像时,必须在安装依赖后添加资产预编译步骤,比如:RUN bundle exec rails assets:precompile RAILS_ENV=production注意要确保执行这个命令时,你的数据库配置、环境变量都已经正确设置(如果预编译过程需要读取配置的话)。
验证资产是否已成功编译
进入运行中的Docker容器,查看public/assets目录,正常情况下应该能看到一堆带哈希值的CSS、JS文件(比如rails_admin-xxxxxx.css)。如果这个目录是空的或者只有少量文件,说明预编译步骤没执行或者执行失败,去翻Docker构建日志找报错信息。确认生产环境的资产配置
打开config/environments/production.rb,确保以下配置正确:config.assets.compile = false # 必须设为false,禁止动态编译 config.assets.digest = true # 启用资产哈希,用于缓存如果
config.assets.compile设为true,虽然能临时解决页面加载问题,但会导致每次请求都编译资产,性能会非常差,绝对不适合生产环境。其他可能的小问题
如果你用了CDN或者第三方资产托管服务,要确保config.action_controller.asset_host配置正确,不然浏览器加载资产时会出现延迟;另外,检查容器的内存是否足够,资产编译过程需要一定内存,内存不足也可能导致编译失败或者运行时性能下降。
按照这些步骤处理后,Rails Admin的页面加载速度应该会立刻恢复正常。
内容的提问来源于stack exchange,提问作者Andrew Lynch

