【问题标题】:Serving Large Files Through Nginx via Rails 2.3 Using x-sendfile通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件
【发布时间】:2010-10-31 13:36:45
【问题描述】:

假设我有一个 Rails 2.3.2 应用程序,前面是 nginx,由 mongrel 提供服务,我需要通过 Rails 提供一个大型静态文件(以控制对它的访问)。我希望 Rails 应用程序将文件传输委托给 nginx,以避免阻塞 mongrel 实例。

现有信息似乎相互矛盾且不完整。 This post 展示了如何使用 Apache 来完成,并暗示它也可以使用 ngninx 来完成 - 但没有示例。 This postthis post 展示了如何使用 Rails 2.3 显然不需要的插件来做到这一点。 This post 建议可能毕竟 nginx 不支持 x-sendfile。

我宁愿不为 Rails 现在可以自己做的事情使用插件。

有没有人在不使用插件和 Rails 2.3/nginx/mongrel 的情况下获得类似 x-sendfile 的行为?如果没有,让它与插件(和/或猴子补丁)和 Rails 2.3/nginx/mongrel 一起工作的最佳文档是什么?

【问题讨论】:

    标签: ruby-on-rails nginx mongrel x-sendfile


    【解决方案1】:

    主要思想:您的控制器所做的就是设置 nginx x-accel-redirect 标头。一旦您的控制器方法返回(这将非常快),nginx 将查看您的 Rails 应用程序集的标题。如果设置了 x-accel-redirect,则 nginx 提供静态文件。

    您的控制器将如下所示:

    def show  
      @attachment = Attachment.find(params[:id])  
      # Do anything else you need for authentication, etc. 
    
      head(:x_accel_redirect => '/files/' + @attachment.filename,  
       :content_type => @attachment.content_type,  
       :content_disposition => "attachment; filename=\"#{@attachment.filename}\"")  
    end  
    

    仅此一项并不能解决问题。您还需要告诉 nginx 位于 $RAILS_ROOT/files 的文件。将此添加到服务器块内 nginx 配置的末尾:

    location /files {
      root /path/to/rails_app;  
      internal;  
    }
    

    将静态文件放入 $RAILS_ROOT/files 中,它应该可以工作。无需插件或猴子补丁 使用 Rails 2.3.2 和 2.3.14 测试。

    【讨论】:

    • 是的,就是这样。请注意,nginx conf 中的 que "root" 必须是该位置的父节点。
    • 这似乎有点老了。这仍然适用于较新版本的 rails 吗?
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2019-07-21
    • 2017-05-10
    • 2012-09-12
    相关资源
    最近更新 更多