在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)_nginx_脚本之家


本站和网页 https://www.jb51.net/article/51854.htm 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)_nginx_脚本之家
脚本之家
服务器常用软件
手机版
投稿中心
关注微信
快捷导航
软件下载
android
MAC
驱动下载
字体下载
DLL
源码下载
PHP
ASP.NET
ASP
JSP
软件编程
C#
JAVA
C 语言
Delphi
Android
网络编程
PHP
ASP.NET
ASP
JavaScript
在线工具
CSS格式化
JS格式化
Html转化为Js
数据库
MYSQL
MSSQL
oracle
DB2
MARIADB
CMS
PHPCMS
DEDECMS
帝国CMS
WordPress
常用工具
PHP开发工具
python
Photoshop
必备软件
网站首页
网页制作
网络编程
脚本专栏
脚本下载
数据库
服务器
电子书籍
操作系统
网站运营
平面设计
其它
媒体动画
电脑基础
硬件教程
网络安全
星外虚拟主机
华众虚拟主机
Linux
win服务器
FTP服务器
DNS服务器
Tomcat
nginx
zabbix
云和虚拟化
服务器其它
您的位置:首页 → 网站技巧 → 服务器 → nginx → Nginx中提升PHP文件下载
在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)
更新时间:2014年07月04日 12:06:56 投稿:junjie
这篇文章主要介绍了在Nginx中使用X-Sendfile头提升PHP文件下载的性能,可以用在针对大文件下载的情况,下载非网站Web目录文件的需求,提供下载权限控制的场景,需要的朋友可以参考下
很多时候用户需要从网站下载文件,如果文件是可以通过一个固定链接公开获取的,那么我们只需将文件存放到 webroot下的目录里就好。但大多数情况下,我们需要做权限控制,例如下载 PDF 账单,又例如下载网盘里的档案。这时,我们通常借助于脚本代码来实现,而这无疑会增加服务器的负担。
例如下面的代码:
<&#63;php
// 用户身份认证,若验证失败跳转
authenticate();
// 获取需要下载的文件,若文件不存在跳转
$file = determine_file();
// 读取文件内容
$content=file_get_contents($file);
// 发送合适的 HTTP 头
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-Length: ". filesize($file));
echo $content; // 或者 readfile($file);
&#63;>
一、这样做有什么问题?
这样做意味着我们的程序需要将文件内容从磁盘经过一个固定的 buffer 去循环读取到内存,再发送给前端 web 服务器,最后才到达用户。当需要下载的文件很大的时候,这种方式将消耗大量内存,甚至引发 php 进程超时或崩溃。Cache 也很头疼,更不用说中断重连的情况了。
一个理想的解决方式应该是,由 php 程序进行权限检查等逻辑判断,一切通过后,让前台的 web 服务器直接将文件发送给用户——像 Nginx 这样的前台更善于处理静态文件。这样一来 php 脚本就不会被 I/O 阻塞了。
二、什么是 X-Sendfile?
X-Sendfile 是一种将文件下载请求由后端应用转交给前端 web 服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下。
X-Sendfile 通过一个特定的 HTTP header 来实现:在 X-Sendfile 头中指定一个文件的地址来通告前端 web 服务器。当 web 服务器检测到后端发送的这个 header 后,它将忽略后端的其他输出,而使用自身的组件(包括 缓存头 和 断点重连 等优化)机制将文件发送给用户。
不过,在使用 X-Sendfile 之前,我们必须明白这并不是一个标准特性,在默认情况下它是被大多数 web 服务器禁用的。而不同的 web 服务器的实现也不一样,包括规定了不同的 X-Sendfile 头格式。如果配置失当,用户可能下载到 0 字节的文件。
使用 X-Sendfile 将允许下载非 web 目录中的文件(例如/root/),即使文件在 .htaccess 保护下禁止访问,也会被下载。
不同的 web 服务器实现了不同的 HTTP 头
SENDFILE 头
使用的 WEB 器
X-Sendfile
Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file
Lighttpd v1.4
X-Accel-Redirect
Nginx, Cherokee
使用 X-SendFile 的缺点是你失去了对文件传输机制的控制。例如如果你希望在完成文件下载后执行某些操作,比如只允许用户下载文件一次,这个 X-Sendfile 是没法做到的,因为后台的 php 脚本并不知道下载是否成功。
三、怎样使用?
Apache 请参考mod_xsendfile模块。下面我介绍 Nginx 的用法。
Nginx 默认支持该特性,不需要加载额外的模块。只是实现有些不同,需要发送的 HTTP 头为 X-Accel-Redirect。另外,需要在配置文件中做以下设定
location /protected/ {
internal;
root /some/path;
表示这个路径只能在 Nginx 内部访问,不能用浏览器直接访问防止未授权的下载。
于是 PHP 发送 X-Accel-Redirect 给 Nginx:
]<&#63;php
$filePath = '/protected/iso.img';
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
//让Xsendfile发送文件
header('X-Accel-Redirect: '.$filePath);
&#63;>
这样用户就会下载到 /some/path/protected/iso.img 这个路径下的文件。
如果你想发送的是 /some/path/iso.img 文件,那么 Nginx 配置应该是
location /protected/ {
internal;
alias /some/path/; # 注意最後的斜杠
您可能感兴趣的文章:Nginx开启一个参数就能让你的WEB性能提升3倍的方法Django之使用celery和NGINX生成静态页面实现性能优化Nginx提高安全与性能的最好配置详解Nginx+Tomcat高性能负载均衡集群搭建教程Nginx+Tomcat搭建高性能负载均衡集群的实现方法加速nginx性能: 开启gzip和缓存Nginx服务器配置性能优化方案提升Nginx性能的一些建议
Nginx
X-Sendfile
PHP文件下载
相关文章
PHP的Symfony和CodeIgniter框架的Nginx重写规则配置这篇文章主要介绍了PHP的Symfony和CodeIgniter框架的Nginx重写规则配置,文中截取配置中关键的一些rewrite写法进行讲解,需要的朋友可以参考下 2016-01-01
深入理解Nginx中Server和Location的匹配逻辑这篇文章主要介绍了深入理解Nginx中Server和Location的匹配逻辑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2019-03-03
在Nginx服务器中配置针对TCP的负载均衡的方法这篇文章主要介绍了在Nginx服务器中配置针对TCP的负载均衡的方法,另外还介绍了TCP负载均衡的执行原理,需要的朋友可以参考下 2015-12-12
Nginx服务器实现数据静态压缩的方法这篇文章主要介绍了Nginx服务器实现数据静态压缩的方法,服务器中压缩CSS和JavaScript进行缓存一定程度上可以帮助提高服务器的IO速度,需要的朋友可以参考下 2015-07-07
nginx简单配置多个server的方法这篇文章主要介绍了nginx简单配置多个server的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-11-11
nginx connect() to unix:/var/run/php-fpm.sock failed (11: Re这篇文章主要介绍了nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable),需要的朋友可以参考下 2015-01-01
使用Nginx搭建流媒体服务器实现直播功能这篇文章主要介绍了使用Nginx搭建流媒体服务器实现直播功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 2020-07-07
深入浅析nginx四种调度算法和进阶这篇文章主要介绍了深入浅析nginx四种调度算法和进阶,文中给大家提到了upstream 支持4种负载均衡调度算法,需要的朋友可以参考下 2018-06-06
使用supervisor管理nginx+tomcat容器的方法示例这篇文章主要介绍了使用supervisor管理nginx+tomcat容器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2019-03-03
通过Nginx解决网络隔离实践记录详解这篇文章主要介绍了通过Nginx解决网络隔离实践记录详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-05-05
最新评论
大家感兴趣的内容
1nginx提示:500 Internal Server Er2nginx 多站点配置方法集合3Nginx服务器的反向代理proxy_pass配置方法讲解4权限问题导致Nginx 403 Forbidden错误的解决5nginx FastCGI错误Primary script 6Nginx 403 forbidden的解决办法7详解nginx upstream 配置和作用8详解Nginx服务器中配置超时时间的方法9Nginx的超时timeout配置详解10Nginx伪静态配置和常用Rewrite伪静态规则集锦
最近更新的内容
Nginx内网单机反向代理的实现nginx 防盗链防爬虫配置详解详解nginx静态资源服务器简单配置Nginx的安装和多域名配置的实现方法Nginx服务器添加Systemd自定义服务过程解析Nginx如何配置Http、Https、WS、WSS的方法步骤权限问题导致Nginx 403 Forbidden错误的解决方法Nginx反向代理proxy_cache_path directive isNginx启动常见错误及解决方法mac 下 安装nginx的方法小结
常用在线小工具
微信
投稿
脚本任务
在线工具
关注微信公众号
关于我们 -
广告合作 -
联系我们 -
免责声明 -
网站地图 -
投诉建议 -
在线投稿
CopyRight 2006-2021 JB51.Net Inc All Rights Reserved. 脚本之家 版权所有