Ruby on rails ActionDispatch::Rails生产环境中的静态

Ruby on rails ActionDispatch::Rails生产环境中的静态,ruby-on-rails,actiondispatch,Ruby On Rails,Actiondispatch,我希望使用ActionDispatch::Static为public以外的目录中的静态文件提供服务。它在开发中工作得很好,但在生产中我似乎不能得到同样的结果 我的静态文件位于/var/www/mysite.com static中。在初始值设定项中,我添加了以下内容: Rails.application.config.middleware.insert_after Rack::SendFile, ActionDispatch::Static, '/var/www/mysite.com-static

我希望使用
ActionDispatch::Static
为public以外的目录中的静态文件提供服务。它在开发中工作得很好,但在生产中我似乎不能得到同样的结果

我的静态文件位于
/var/www/mysite.com static
中。在初始值设定项中,我添加了以下内容:

Rails.application.config.middleware.insert_after Rack::SendFile, ActionDispatch::Static, '/var/www/mysite.com-static'
rake中间件
的输出如下:

use Raven::Rack
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000005e61130>
use Rack::Runtime
...
使用Raven::Rack
使用Rack::Sendfile
使用ActionDispatch::Static
使用Rack::Lock
使用#
使用Rack::Runtime
...

为什么我在/var/www/myapp.com static中请求的每个页面上都有404?

我最终解决了这个问题,在Rails应用程序的
config.ru
中添加了中间件

require ::File.expand_path('../config/environment',  __FILE__)

# Added the following line
use ActionDispatch::Static, '/var/www/myapp.com-static'

run Rails.application

这之所以有效,是因为我在一个初始值设定项中为ActionDispatch::Static设置了路径,该初始值设定项是在安装中间件之后加载的。如果我正确地配置了加载顺序,
Rails.application.config.middleware
也可以工作。

如果nginx为您的静态资产服务,那么您为什么要借助Rails app来处理它呢?nginx在/var/www/myapp.com/public中为我的静态资产服务。我还想在/var/www/myapp.com-static中提供静态资产。据我所知,nginx只允许您指定一个根(不使用位置)。这很奇怪。虽然两者之间存在一些差异,但不确定为什么在不同的位置添加ActionDispatch::Static会产生不同。是的,我也这么认为。最奇怪的是,使用config.middleware.use在开发和测试中可以正常工作,但在生产环境中却无法正常工作。这在开发环境中正常工作而在生产环境中无法正常工作的明显原因是,NGinX试图从错误的位置提供文件,但却无法正常工作。所以,既然您提供的是静态文件,那就没那么奇怪了:-)您能详细说明一下吗?我不知道你的意思。如果NGinX识别出目录,尝试从静态目录提供文件,并在你的应用程序有机会尝试之前提供404,那么这将是一个明显的失败模式。