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

Ric*_*aca 11 mongrel ruby-on-rails x-sendfile nginx

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

可用的信息似乎是矛盾和不完整的.这篇文章展示了如何用Apache做到这一点,并暗示它也可以用ngninx完成 - 但没有例子.这篇文章这篇文章展示了如何使用一个显然Rails 2.3使得不必要的插件来实现它.这篇文章表明可能毕竟不支持带有nginx的x-sendfile.

对于Rails现在可以自行完成的事情,我宁愿不要使用插件.

有没有人使用没有插件和Rails 2.3/nginx/mongrel的x-sendfile式行为?如果没有,那么使用插件(和/或monkeypatch)和Rails 2.3/nginx/mongrel的最佳文档是什么?

Ric*_*aca 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  
Run Code Online (Sandbox Code Playgroud)

仅凭这一点就不行了.您还需要告诉nginx有关位于$ RAILS_ROOT/files的文件.将其添加到服务器块内nginx配置的末尾:

location /files {
  root /path/to/rails_app;  
  internal;  
}
Run Code Online (Sandbox Code Playgroud)

将静态文件放入$ RAILS_ROOT/files中它应该可以工作.不需要插件或monkeypatching使用Rails 2.3.2和2.3.14测试.

  • 你是男人的冠军,谢谢你. (2认同)