【问题标题】:rack-zippy and option -d in production env doesn't serve static assets生产环境中的 rack-zippy 和选项 -d 不提供静态资产
【发布时间】:2014-02-07 13:43:42
【问题描述】:

我在这里遇到了一个非常奇怪的问题。我在我的rails 应用程序中使用rack-zippy gem,如果我在没有预编译资产的development 环境中启动它,它就像一个魅力。使用 -d 参数和不使用。

在生产模式下(同一台机器、同一项目、同一目录、同一 gem)它也可以工作。但是如果我用-d 参数(bundle exec rails server -d)启动它来守护服务器,则不会提供预编译的资产。可以用thinwebrick 重现,但不能用unicorn 重现。

日志说:

ActionController::RoutingError (No route matches [GET]
    "/assets/application-b9b75968aed42128cfd75fb78df1e4d1.js"):

但是:

$ l public/assets/application-b9b75968aed42128cfd75fb78df1e4d1.js
-rw-r--r-- 1 public/assets/application-b9b75968aed42128cfd75fb78df1e4d1.js

来自 config/environments/production.rb:

config.serve_static_assets = true

来自 config/application.rb:

config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer)

还有:

$ rake middleware            
use Rack::Sendfile
use Rack::Zippy::AssetServer
(...)

我现在有点困惑。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby asset-pipeline thin


    【解决方案1】:

    哎呀,我从来没有遇到过这种情况,但我会告诉你我的直觉,也许你可以用这个找到某个地方。 (感谢您在 Github 问题跟踪器上报告)。

    所以unicorn是可以的,但是thin和webrick不行,嗯。

    我的猜测是thin 和webrick 的守护进程使用的工作目录不是Rails.root。您可能想尝试在 rack-zippy 中调试此行,以查看正在搜索资产文件的路径:https://github.com/eliotsykes/rack-zippy/blob/master/lib/rack-zippy.rb#L87

    rack-zippy 从 1.1.0 版开始(如果您使用的是最新的 Gem,您可能正在使用它)将它找不到文件的所有请求传递到剩余的中间件堆栈。

    在开发+守护模式下,rack-zippy会将请求传递到资产管道,所以我认为我们可以假设资产管道在守护模式下没有问题。

    在生产+守护程序模式下,资产管道可能被禁用(如您所愿),如果 rack-zippy 找不到资产文件(如果工作目录不是 Rails.root),然后剩下的中间件会给你你看到的路由错误。

    如果您在生产中启用资产管道(非常不推荐),那么我预计路由错误会消失,并且 rack-zippy 不会做任何有用的事情。

    对不起,我没有更可靠的事情可以继续。

    【讨论】:

    • 感谢艾略特的建议。很高兴听到 gem 开发人员本身的声明。我会尝试按照你的想法进行调试,然后给你反馈:)
    • 谢谢,我期待着了解你的进展,祝你好运!
    • 好的,我已经尝试调试过了。我发现的第一件事:serve? 方法中的路径是相同的。那不是问题。但如果服务器以守护程序模式运行,则该方法返回 false。如果删除了一个简单的Dir.pwd 登录到serve? 方法,该方法揭示了所有邪恶的原因(并赞同你的直觉):Dir.pwd 没有-d 是rails 根目录。 Dir.pwd-d 只是'/'。
    【解决方案2】:

    在下一个版本的 rack-zippy 中发布修复程序之前,为了解决这个问题,你有这行(可能在 config/application.rbconfig/initializers/rack_zippy.rb):

    Rails.application.config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer)
    

    替换为:

    # Rails.public_path as last argument here gets passed into the Rack::Zippy::AssetServer
    # constructor to override the default asset_root argument value.
    Rails.application.config.middleware.swap(ActionDispatch::Static, Rack::Zippy::AssetServer, Rails.public_path)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-28
      • 2022-11-10
      • 2014-04-13
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      相关资源
      最近更新 更多