此消息意味着为您Rack::Sendfile
禁用X-Accel-Redirect
,因为您在 nginx.conf 中缺少配置...
我正在使用Nginx + Passenger 3 + Rails 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
通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件
我有控制器,它将/download/1
请求映射到具有自己的目录结构的存储文件,例如:storage/00/00/1
等storage/01/0f/15
。所以我需要通过 Rails 传递它,但是我需要使用send_file
将用于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 倍,并且日志中没有显示错误。
希望这可以帮助。