2009-06-05 7 views
11

Załóżmy, że mam aplikację Rails 2.3.2 fronted by nginx i jest obsługiwana przez kundla, w którym muszę obsługiwać duży plik statyczny poprzez Railsy (aby kontrolować dostęp do niego). Chcę, aby aplikacja Railsowa delegowała przesyłanie pliku do nginx, aby uniknąć blokowania instancji kundla.Obsługa dużych plików za pośrednictwem Nginx za pomocą szyn 2.3 Używanie x-sendfile

Dostępne informacje wydają się sprzeczne i niekompletne. This post pokazuje, jak to zrobić z Apache, i podpowiedzi, że można to zrobić również z ngninx - ale bez przykładów. This post i this post pokazują, jak to zrobić za pomocą wtyczki, która najwyraźniej sprawia, że ​​Rails 2.3 jest niepotrzebny. This post sugeruje, że być może nie ma obsługi plików x-sendfile z nginx.

Wolałbym nie mieszać się z wtyczkami do rzeczy, które Railsy mogą teraz wykonywać samodzielnie.

Czy ktoś uzyskał zachowanie podobne do x-sendfile do pracy bez użycia wtyczek i Rails 2.3/nginx/mongrel? Jeśli nie, jaka jest najlepsza dokumentacja pozwalająca na uruchomienie go za pomocą wtyczki (i/lub monkeypatch) i Rails 2.3/nginx/mongrel?

Odpowiedz

24

Główna idea: wszystko, co robi twój kontroler, to ustawienie nagłówka nginx x-accel-redirect. Po powrocie metody kontrolera (która będzie bardzo szybka), nginx przyjrzy się nagłówkowi ustawionemu przez Twoją aplikację Rails. Jeśli ustawione jest x-accel-redirect, to nginx obsługuje plik statyczny.

Twój kontroler będzie wyglądać następująco:

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 

Samo to nie załatwi. Musisz także poinformować nginx o plikach znajdujących się w $ RAILS_ROOT/files. Dodaj to do końca swojej nginx config wewnątrz bloku serwera:

location /files { 
    root /path/to/rails_app; 
    internal; 
} 

Umieść plik statyczny do $ RAILS_ROOT/plików i powinno działać. Nie ma potrzeby stosowania wtyczek lub monkeypatching Testowane przy użyciu Rails 2.3.2 i 2.3.14.

+2

Jesteś mistrzem wśród mężczyzn, dzięki za to. – hornairs

+1

Schludnie! Prosto i prosto do rzeczy! –

+0

Numer referencyjny Nginx na X-accel: http://wiki.nginx.org/X-accel –

Powiązane problemy