11

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

现有信息似乎相互矛盾且不完整。这篇文章展示了如何用 Apache 来做,并暗示它也可以用 ngninx 来做——但没有例子。这篇文章这篇文章展示了如何使用 Rails 2.3 显然不需要的插件来做到这一点。这篇文章表明,也许 nginx 不支持 x-sendfile。

对于 Rails 现在可以自己做的事情,我宁愿不要乱用插件。

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

4

1 回答 1

24

主要思想:您的控制器所做的就是设置 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 测试。

于 2009-06-05T15:16:00.133 回答