Serving Large Files Through Nginx via Rails 2.3 Using x-sendfile Serving Large Files Through Nginx via Rails 2.3 Using x-sendfile ruby-on-rails ruby-on-rails

Serving Large Files Through Nginx via Rails 2.3 Using x-sendfile


The main idea: all your controller does is to set the nginx x-accel-redirect header. Once your controller method returns (which will be very fast), nginx will look at the header your Rails app set. If x-accel-redirect is set, then nginx serves the static file.

Your controller will look something like:

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  

This alone won't do the trick. You need to also tell nginx about the files located at $RAILS_ROOT/files. Add this to the end of your nginx config inside the server block:

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

Put the static file into $RAILS_ROOT/files and it should work. No need for plugins or monkeypatching Tested with Rails 2.3.2 and 2.3.14.