通过 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? [关闭]