lighttpd 有一个 X-Sendfile 的特性很有意思。比如传统的做一些需要严格验证的下载之类的功能比如收费下载,需要在程序里验证权限,然后由程序读取文件输出,这样性能不好,占用资源也大,而 web server 本身的功能又不足以提供验证。使用 X-Sendfile 就可以让程序来做验证,而把文件传输交给 web server 来做,各自做各自擅长的事情。
本来以为这功能目前就 lighttpd 有,今天发现原来 nginx 也有这能力,apache 也可以通过第三方模块来实现。
nginx 上这个功能叫做 X-Accel-Redirect 。
假设下载文件的路径在 /path/to/files,比如有 /path/to/files/test1.txt 可以在 nginx 里配置
location /down {
internal;
alias /path/to/files;
}
internal 选项是这个路径只能在 nginx 内部访问。
然后可以在 php 里写
header("X-Accel-Redirect: /down/test1.txt");
就可以了。
另外,如果在程序那头如果不想要开头的那个“/”,比如想写成 header("X-Accel-Redirect: down/test1.txt"); ,那么在 nginx 的那条 alias 的最后就要加一个 “/”。
什么是sendfile?
nginx官方只是一句带过,如果你需要了解详细的请参考: http://celebnamer.celebworld.ws/stuff/mod_xsendfile/
为什么要用sendfile?
原因很简单,项目中有个需求是后端程序负责把源文件打包加密生成目标文件,然后程序读取目标文件返回给浏览器;这种做法有个致命的缺陷就是占用大量后端程序资源,如果遇到一些访客下载速度巨慢,就会造成大量资源被长期占用得不到释放,很快后端程序就会因为没有资源可用而无法正常提供服务。通常表现就是nginx报502错误!其次在nginx内部我还想实现“由nginx检查目标文件是否存在,如果存在的话就直接返回给浏览器而无需经过后端程序的处理”,这样一来后端程序只是负责生成目标文件,一单目标文件被生成,基本上就不再提供服务,而nginx则提供全静态的文件浏览服务。可想而知,性能的提升还是大很多的!
怎么启用sendfile?
详细配置步骤就不说了,官方wiki已经说明的比较清楚。只提一下注意点吧:
1,location 必须 被定义为 internal;
2,如果在location中使用alias 一定要注意目录结尾的“/”;
3,要注意location 匹配时尽量只用目录名。 我在测试中遇到抓狂的问题。
先说一下我最终的方案:
1,增加一个location作为目标文件的检查,如果存在 就发给internal的location继续处理,如果不存在就rewrite到后端程序处理;
location ~ ^/ vdir /(.*)\.ext$
|
if (!-f /path/to/obj/ dir /$obj_file)
|
rewrite ^ /backend/app last;
|
rewrite ^ /revdir/$obj_file last;
|
以上代码可实现“由nginx检查目标文件是否存在,如果存在的话就直接返回给浏览器而无需经过后端程序的处理”。
接下来看下sendfile相关的location
程序里送出的header是 :
X-Accel-Redirect: /revdir/a/b/xxx.ext |
需要再原本的文件路径前加一个虚拟目录 /revdir/
下面讲一下访客在浏览 http://yourdomain/vdir/d/i/r/xxx.ext时的一些处理过程:
1,nginx会先去检查是否存在目标文件”/path/to/obj/dir/d/i/r/xxx.ext”
2.1,如果文件不存在,就会发起一个rewrite ,将请求发往后端程序处理生成文件,然后后端程序只送出”X-Accel-Redirect”header之后完成处理,nginx接受X-Accel-Redirect会被 location /revdir 匹配到,继而发送该文件;
2.1,如果文件存在,也会发起一个rewrite ,然后会被 location /revdir 匹配到,继而直接发送该文件无需经过后端程序;
3,over.
提醒注意:
如果你在测试中发现nginx报500,首先一个考虑下是不是重复匹配次数达到nginx内部预设的10次上限,然后报500错误。有方法可以验证,适当的location添加:
详细请点击参考官方wiki
最后再提一点,远程文件怎么使用这个功能来转发呢? 不是proxy喔~~
有兴趣的可以参考这里:Nginx-Fu: X-Accel-Redirect From Remote Servers
分享到:
相关推荐
配置Nginx使用X-Sendfile时,首先要在Nginx配置文件中创建一个内部访问的location,比如`/protected/`,并设置相应的根目录,确保只有Nginx可以访问这些文件: ```nginx location /protected/ { internal; root /...
sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; ...
9. sendfile 支持:Nginx 支持 sendfile 函数,可以提高文件传输的效率。 Nginx 的安装和配置: 1. 安装 Nginx:可以在 Windows、FreeBSD、Ubuntu、Fedora 等多种操作系统上安装 Nginx。 2. 配置 Nginx:可以使用...
* 高效文件传输模式(sendfile)设置为on * 长连接超时时间(keepalive_timeout)设置为65秒 * 启用Gzip压缩(gzip)设置为on * 服务器集群(upstream)配置,包括两个Tomcat实例,分别权重为1和2 * Nginx服务器配置...
### Linux下Nginx+Tomcat整合的安装与配置详解 在现代的Web服务器架构中,Nginx作为高性能的反向代理服务器和负载均衡器,常被用来与Tomcat等应用服务器配合使用,以提高网站的响应速度、稳定性和安全性。本文将...
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, #以平衡磁盘与网络I/O处理速度,降低...
Nginx 配置文件 nginx.conf 详解 Nginx 配置文件 nginx.conf 是 Nginx...文件传输是 Nginx 服务器处理文件传输的重要组件,我们可以通过 `sendfile` 指令来设置文件传输,例如 `sendfile on;`,这将开启文件传输功能。
* sendfile 指令指定了 Nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件。 * sendfile 的值可以根据实际情况进行调整,例如普通应用可以设置为 on,磁盘 IO 重负载应用可以设置为 off。 六、keepalive_...
### Nginx的基本配置与优化 #### 一、Nginx简介 Nginx是一款广泛使用的高性能Web服务器和反向代理服务器,它以其出色的稳定性、丰富的功能集、简单的配置方式和较低的内存消耗而闻名。Nginx可以作为HTTP服务器处理...
4. **sendfile_max_chunk指令**:如果`sendfile`启用,则定义每个worker进程每次调用`sendfile()`发送数据的最大大小。格式为 `sendfile_max_chunk size;`,其中`size`是具体的大小。 - 示例:`sendfile_max_chunk ...
第25章 Nginx与X-Sendfile 第26章 在Nginx的响应体之前或之后添加内容 第27章 Nginx与访问者的地理信息 第28章 Nginx的图像处理 第29章 location中随机显示文件 第30章 后台Nginx服务器记录原始客户端的IP地址 ...
第25章 Nginx与X-Sendfile 第26章 在Nginx的响应体之前或之后添加内容 第27章 Nginx与访问者的地理信息 第28章 Nginx的图像处理 第29章 location中随机显示文件 第30章 后台Nginx服务器记录原始客户端的IP地址 ...
这里`include`指令用于引入其他配置文件,`default_type`定义默认MIME类型,`sendfile`启用高效文件传输,`keepalive_timeout`设置客户端保持连接的超时时间。 4. **server块** - `server`块定义了一个监听特定...
第25章 Nginx与X-Sendfile 第26章 在Nginx的响应体之前或之后添加内容 第27章 Nginx与访问者的地理信息 第28章 Nginx的图像处理 第29章 location中随机显示文件 第30章 后台Nginx服务器记录原始客户端的IP地址 ...
# 使用 sendfile 提高性能 add_header 'Accept-Ranges' 'bytes'; # 支持断点续传 client_max_body_size 100M; # 设置最大允许下载文件大小,可根据需要调整 try_files $uri $uri/ =404; # 如果文件不存在,返回...
# 开启sendfile传输文件 tcp_nopush on; # 优化TCP推送 keepalive_timeout 65; # 长连接超时时间 # server块 server { listen 80; # 监听端口 server_name example.com; # 服务器名或IP # location块 ...
* http块(HTTP Block):配置的指令包含文件引入、MIME-Type的定义、日志定义、是否使用sendfile传输文件、连接超时时间、单链接请求数的上限等。 * server块(Server Block):server块相当于一个虚拟机,一个...
可以设置并发用户数、请求次数等参数,对Nginx服务器进行压力测试,获取吞吐量、响应时间等指标,根据测试结果进行性能优化,如调整worker_processes、worker_connections、sendfile、tcp_nopush等Nginx配置参数。...
sendfile on; # 开启高效文件传输模式 keepalive_timeout 65; # 客户端连接保持活动状态的时间 } ``` 5. **server块** server块是配置虚拟主机的地方,通过监听不同的端口或设置不同的服务器名称来处理不同的...