2009-06-05 231 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