Nginx 的 X-Accel-Redirect(X-Sendfile)

本文介绍了如何在Nginx服务器上利用X-Accel-Redirect特性实现高效文件下载,避免脚本输出大文件带来的服务器负担。通过配置内部请求路径并设置header,实现内部重定向,确保文件安全。同时提到了X-Accel-Redirect与Nginx内部处理的关系,以及使用时的注意事项和额外的控制选项。

系统 : Windows XP SP2

服务器 : Nginx

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

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

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

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

1.配置

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

在server 段中配置.

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

location /download/ {

internal;

root /cygdrive/d/web/filesave/;

}

这里的internal 至 关重要,后面我们会说到为什么他很重要.所以这里请先注意一下.root 就不用说了 , 后面的路径是文件存放的实际物理地址,/cygdrive/d 实际上指代的是D盘,因为windows 版的Nginx 是在cygwin的支持下实现的,cywin 是个很强的Unix 模拟工具,同时他为Unix程序能在windows下编译运行停工了,强大的接口!其他的也不多说了!

如果你想通过 /download/这个路径来实现下载地址的模拟实际地址 D:/web/filesave/download/ 下的同名文件下载,你就可以如下配置

location /download/ {

internal;

root /cygdrive/d/web/filesave; <―-注意这里少了一个斜线

}

2.程序调用

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

header('X-Accel-Redirect: /download/thaiki.exe');

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

现在我们来说说上面提到的 internal , internal 顾名思义就是指的 Nginx 的内部处理指令, 引用官方的解释就是"表明 只有内部的请求才能使用的.例如请求返回404错误. "而到这里 , 显而易见的是header('X-Accel-Redirect: /download/thaiki.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

### Nginx 中 `sendfile` 配置的使用方法与性能优化 `sendfile` 是 Nginx 提供的一个重要配置参数,用于优化文件传输性能。它通过利用操作系统提供的 `sendfile()` 系统调用,实现高效的零拷贝(zero-copy)文件传输机制。默认情况下,`sendfile` 的配置为 `on`,即启用零拷贝技术。 在 Nginx 的配置文件中,`sendfile` 的启用或禁用非常简单,只需在 `http` 或 `server` 块中添加以下配置: ```nginx sendfile on; ``` 如果需要禁用该功能,可以设置为: ```nginx sendfile off; ``` 通过启用 `sendfile on;`,Nginx 能够直接将文件从内核空间传输到网络接口,而无需将数据复制到用户空间。这种方式显著减少了数据传输过程中的拷贝步骤,从而提升了性能[^4]。 --- ### `sendfile` 的性能优化作用 1. **减少内存使用** 使用 `sendfile` 技术时,文件数据不需要被复制到用户空间缓冲区,因此服务器的内存资源可以用于处理其他任务。这种方式降低了内存的占用,提高了整体系统的资源利用率。 2. **提高传输效率** 由于数据直接从内核缓冲区传输到网络接口,减少了从内核到用户空间的复制操作,文件传输速度得到了显著提升。这种方式特别适用于静态文件传输场景,例如图片、视频、文档等资源的分发[^2]。 3. **降低 CPU 使用率** 数据传输过程中减少了拷贝步骤,CPU 的负担也随之减轻。这使得 CPU 可以更专注于处理其他请求,例如动态内容生成、连接管理等任务,从而进一步提升服务器的性能[^2]。 4. **避免上下文切换开销** 在传统文件传输方式中,每次数据传输都需要在内核模式和用户模式之间切换,而 `sendfile` 技术能够避免这种上下文切换,从而进一步优化性能[^1]。 --- ### 与其他性能优化配置的结合使用 为了充分发挥 `sendfile` 的优势,通常需要结合其他 Nginx 配置进行优化: - **`tcp_nopush` 和 `tcp_nodelay`** 在启用 `sendfile` 的同时,建议配置 `tcp_nopush on;` 和 `tcp_nodelay on;`。`tcp_nopush` 确保数据包尽可能完整地发送,而 `tcp_nodelay` 则减少网络延迟,从而进一步提升传输效率。 ```nginx tcp_nopush on; tcp_nodelay on; ``` - **调整文件描述符限制** 为了支持高并发场景,需要确保操作系统允许 Nginx 进程打开足够多的文件描述符。可以通过以下配置设置最大文件描述符数: ```nginx worker_rlimit_nofile 65535; ``` - **优化 worker 进程和连接数** 设置 `worker_processes` 为服务器的 CPU 核心数,并调整 `worker_connections` 以充分利用系统资源。例如: ```nginx worker_processes auto; events { worker_connections 65535; } ``` --- ### 使用场景与注意事项 1. **适用场景** `sendfile` 最适合用于静态文件的传输优化,例如网站的图片、CSS、JavaScript 文件等。对于动态内容(例如 PHP、Python 生成的响应),`sendfile` 的作用有限。 2. **兼容性** 某些情况下,例如启用了 `X-Accel-Redirect` 或者使用了某些代理配置时,`sendfile` 可能无法正常工作。此时需要根据具体场景进行调整。 3. **日志记录** 启用 `sendfile` 后,Nginx 的访问日志仍然可以正常记录请求信息,但需要注意日志格式和性能之间的平衡。 --- ### 总结 通过合理配置 `sendfile`,Nginx 可以显著提升文件传输的性能,减少内存和 CPU 的开销,尤其适用于高并发和大流量的静态资源传输场景。结合其他优化配置,如 `tcp_nopush`、`tcp_nodelay` 和 `worker_connections`,可以进一步提升服务器的整体性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值