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

Rails 6生产环境执行rake middleware报错:找不到ActionDispatch::Static

解决Rails生产环境下"No such middleware to insert before ActionDispatch::Static"错误

问题场景

执行命令:

RAILS_ENV=production bundle exec rake middleware

报错:

No such middleware to insert before ActionDispatch::Static

执行带trace的命令:

RAILS_ENV=production bundle exec rake middleware --trace

得到以下错误栈:

** Invoke middleware (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
No such middleware to insert before: ActionDispatch::Static
/home/fugee/.rvm/gems/ruby-3.0.3/gems/actionpack-6.1.4.4/lib/action_dispatch/middleware/stack.rb:162:in `assert_index'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/actionpack-6.1.4.4/lib/action_dispatch/middleware/stack.rb:101:in `insert'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/configuration.rb:53:in `block in insert_before'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/configuration.rb:95:in `block in merge_into'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/configuration.rb:94:in `each'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/configuration.rb:94:in `merge_into'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/engine.rb:524:in `block in app'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/engine.rb:521:in `synchronize'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/engine.rb:521:in `app'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/application/finisher.rb:108:in `block in module:Finisher'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/initializable.rb:32:in `instance_exec'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/initializable.rb:32:in `run'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/initializable.rb:61:in `block in run_initializers'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:228:in `block in tsort_each'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:431:in `each_strongly_connected_component_from'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:349:in `block in each_strongly_connected_component'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:347:in `each'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:347:in `call'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:347:in `each_strongly_connected_component'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:226:in `tsort_each'
/home/fugee/.rvm/rubies/ruby-3.0.3/lib/ruby/3.0.0/tsort.rb:205:in `tsort_each'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/initializable.rb:60:in `run_initializers'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/application.rb:391:in `initialize!'
/home/fugee/websites/vibratrek-spree-4.4/config/environment.rb:5:in `<main>'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/zeitwerk-2.5.3/lib/zeitwerk/kernel.rb:35:in `require'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/activesupport-6.1.4.4/lib/active_support/dependencies.rb:332:in `block in require'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/activesupport-6.1.4.4/lib/active_support/dependencies.rb:299:in `load_dependency'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/activesupport-6.1.4.4/lib/active_support/dependencies.rb:332:in `require'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/application.rb:367:in `require_environment!'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/railties-6.1.4.4/lib/rails/application.rb:533:in `block in run_tasks_blocks'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:243:in `block in invoke_prerequisites'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:241:in `each'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:241:in `invoke_prerequisites'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:218:in `block in invoke_with_call_chain'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
/home/fugee/.rvm/gems/ruby-3.0.3/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/home/fugee/.rvm/gems/ruby-3.0.3/bin/rake:25:in `load'
/home/fugee/.rvm/gems/ruby-3.0.3/bin/rake:25:in `<main>'
/home/fugee/.rvm/gems/ruby-3.0.3/bin/ruby_executable_hooks:22:in `eval'
/home/fugee/.rvm/gems/ruby-3.0.3/bin/ruby_executable_hooks:22:in `<main>'
Tasks: TOP => middleware => environment

原因分析

错误核心是:代码或某个gem尝试在ActionDispatch::Static中间件之前插入另一个中间件,但生产环境下该中间件默认未加载。

Rails生产环境中,静态文件通常由Nginx、Apache等外部Web服务器处理,因此ActionDispatch::Static会被自动禁用,不会出现在中间件栈中,导致插入操作失败。

解决方法

方法1:调整中间件插入逻辑

找到项目中所有调用config.middleware.insert_before(ActionDispatch::Static, SomeMiddleware)的代码,修改为以下两种方式之一:

  • 若中间件不需要特定位置,直接添加到栈末尾:
    config.middleware.use SomeMiddleware
    
  • 若必须关联静态文件处理逻辑,按环境区分插入:
    if Rails.env.development?
      config.middleware.insert_before(ActionDispatch::Static, SomeMiddleware)
    else
      config.middleware.use SomeMiddleware
    end
    

方法2:强制启用ActionDispatch::Static(不推荐)

如果确实需要Rails在生产环境处理静态文件,可在config/environments/production.rb中添加:

config.public_file_server.enabled = true

此操作会加载ActionDispatch::Static,但会降低静态文件处理性能,仅适用于特殊场景。

方法3:排查gem兼容性

若不是自定义代码导致的问题,检查Gemfile中处理静态文件、缓存或请求拦截的gem,查看其文档是否有生产环境专属配置,或是否存在与Rails 6.1版本不兼容的情况。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:20:32