это сообщение означает, что Rack::Sendfile
отключено X-Accel-Redirect
для вас, потому что у вас отсутствует конфигурация для него в nginx.conf ...
Я использую Nginx + Пассажир 3 + Рельсы 3.1 .
Собрав информацию с этих страниц, я понял:
http://wiki.nginx.org/X-accel
http://greenlegos.wordpress.com/2011/09/12/sending-files-with-nginx-x-accel-redirect
http://code.google.com/p/substruct/source/browse/trunk/gems/rack-1.1.0/lib/rack/sendfile.rb?r=355
Обслуживание больших файлов через Nginx через Rails 2.3. Использование x-sendfile
У меня есть контроллер, который отображает /download/1
запросов на файлы хранения, которые имеют свою собственную структуру каталогов, например: storage/00/00/1
, storage/01/0f/15
и т. Д. Поэтому мне нужно передать это через Rails, но затем мне нужно использовать 1031 * метод, который будет использовать X-Accel-Redirect
для отправки окончательного файла в браузер через nginx напрямую .
В коде у меня есть это:
send_file(
'/var/www/shared/storage/00/00/01',
:disposition => :inline,
:filename => @file.name # an absolute path to the file which you want to send
)
Я заменил имя файла для целей этого примера
Теперь мне нужно было добавить эти строки в мой nginx.conf
:
server {
# ...
passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /var/www/shared/storage/=/storage/;
passenger_pass_header X-Accel-Redirect;
location /storage {
root /var/www/shared;
internal;
}
# ...
}
Путь /storage
не виден из внешнего мира, он только внутренний.
Rack::Sendfile
получает заголовок X-Accel-Mapping
, извлекает из него путь и заменяет /var/www/shared/storage
на /storage...
. Затем выплевывает измененный заголовок:
X-Accel-Redirect: /storage/00/00/01
, который затем обрабатывается nginx .
Я вижу, что это работает правильно, поскольку файл загружается в 100 раз быстрее, чем раньше, и в журналах не отображается никаких ошибок.
Надеюсь, это поможет.