分享

Nginx中的x-sendfile机制

 HiLinz 2012-09-18

Nginx中的x-sendfile机制

2010-04-27    文章来源:互联网    浏览次数:3248     分享文章     评论:腾讯微博 新浪微博

公司出了个网络存储的产品,下载部分起初我是用PHP的readfile函数实现的…

但是网站里存储的文件可能会比较大,那么使用脚本输出文件无疑会增加服务器的负担…

寻觅许久,终于觅得 X-Sendfile ,这个特性 lighthttd 是支持的,apache2 也可以通过增加模块提供支持!

鉴于我本地使用的是Nginx服务器,所以我找到了一些关于Nginx 这方面的内容,Nginx 也支持 X-Sendfile 特性,但是这个特性在Nginx上叫做 X-Accel-Redirect 下面就来谈谈如何配置以及依靠 X-Accel-Redirect 特性实现下载.

linux kernel2.2开始支持sendfile,2.4.21支持sendfile64.只要你的kernel支持sendfile,nginx就会自动启用sendfile,在配置文件里用sendfile on/off开关sendfile。

1.配置

关于Nginx 主机的基本配置这里就不多说了,直接进入正题:

在server 段中配置.

例如你想通过 /download/这个路径来实现下载地址的模拟实际地址 /media/common/savefiles/下的同名文件下载,你就可以如下配置

location / {

rewrite ^/download/(.*) /down.php?path=$1 last;
 root /media/common/www;
index  index.php index.html index.htm;
autoindex on;

}
location /savefiles {

internal;

alias    /media/common/download;

}
 

2.程序调用

程序调用很容易,只要程序输出一个HTML header 就可以了 内容类似如下,比如你要下载服务器中  /media/common/savefiles/ 下的file.exe ,那么你只要使用程序输出以下头信息(以PHP为例):

header("Content-Disposition: attachment; filename= '{$filename}'");
header("Content-Type: application/octet-stream");
header('X-Accel-Redirect: /savefiles/file.exe');
header("X-Accel-Buffering: yes");
header("X-Accel-Limit-Rate :102400"); //速度限制 Byte/s
//header("Accept-Ranges: none");//单线程 限制多线程

你同样可以给下载的文件重命名,或者指定它的文件类型,但是这些不在本文的讨论范围之内.

现在我们来说说上面提到的 internal , internal 顾名思义就是指的 Nginx 的内部处理指令, 引用官方的解释就是"表明 只有内部的请求才能使用的.例如请求返回404错误. " 而到这里 , 显而易见的是header('X-Accel-Redirect: /download/file.exe');是向服务器提交了一个内部请求,然后Nginx自动将此连接转向到实际的地址.而经过我和头儿使用 firefox 的 firedebug 测试,也确实没有捕捉到 X-Accel-Redirect 头信息!所以我们只是猜想,可能Nginx在发送数据之前先对数据进行了检验,然后检测到这些信息就自动过滤,提交到内部处理.因为没见过源码,所以也只 能说是猜想!不过其实想想也明白了,如果这些头信息被捕捉 一些关键信息暴露 那么这个特性的安全性就会大大折扣!

3.注意事项

在使用时候,你必须要明白以下头信息是不能被Nginx更改的(即这些信息得由你来指定!)

Content-Type

Content-Disposition

Accept-Ranges

Set-Cookie

Cache-Control

Expires

如果其中的一些信息没有指定,那么重定向请求设置!

4.更多处理控制

你可以通过一下头信息来配置 X-Accel-Redirect 特性:

X-Accel-Limit-Rate: 1024

X-Accel-Buffering: yes|no

X-Accel-Charset: utf-8

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多