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
相关产品推荐
相关产品推荐

