2009-06-05 218 views
11

比方说,我有一个Rails 2.3.2应用程序由nginx驱动,并由mongrel提供服务,其中我需要通过Rails提供大量静态文件(以控制对它的访问)。我希望Rails应用程序将文件传输委托给nginx,以避免阻塞mongrel实例。通过Nginx通过Rails提供大文件2.3使用x-sendfile

可用信息似乎矛盾和不完整。 This post显示了如何使用Apache来做到这一点,并暗示它也可以用ngninx来完成 - 但没有例子。 This postthis post展示了如何使用显然Rails 2.3不需要的插件来实现它。 This post表明可能最终还是不支持带nginx的x-sendfile。

我宁愿不去搞清楚Rails现在可以自行完成的事情。

有没有人得到类似x-sendfile的行为来使用无插件和Rails 2.3/nginx/mongrel?如果没有,那么使用插件(和/或monkeypatch)和Rails 2.3/nginx/mongrel工作的最佳文档是什么?

回答

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 /文件,它应该工作。无需插件或monkeypatching使用Rails 2.3.2和2.3.14进行测试。

+2

你是男性的冠军,感谢这一点。 – hornairs 2010-01-23 16:13:08