通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 吗?

以上是关于通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.2.3 GeoLocation 使用 MaxMind

是否可以在 cPanel 共享帐户中使用 x-Sendfiles? [关闭]

Rails 2.3:Postmarkapp 的 SMTP 设置:连接被拒绝 - 连接(2)

PHP下载文件限速X-sendfile

uwsgi特性

是否可以将 gem mysql2 与 rails 2.3 一起使用?