| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Nginx的X-Accel-Redirect实现大文件下载 -> 正文阅读 |
|
[系统运维]Nginx的X-Accel-Redirect实现大文件下载 |
一、文件下载的几种方式
1、直接给出下载地址,使用静态文件服务器nginx下载。任何人都可以下载,无法控制用户的权限。
2、后端流式读取文件内容,设置header后疯狂输出
django文档中提到,可以向HttpResponse传递一个迭代器,流式的向客户端传递数据,如下:
这样做可以实现权限的控制,但这个过程需要后端进程将文件读取到内存中然后再发给用户,会造成很大的资源开销。如果你文件较大,可能会超时,并且会占用比较大的内存,当用户下载量很大时有可能造成程序的崩溃。
3、后端过滤与权限控制,再发出指令给web服务器来传输静态文件
Django(做权限判断)+nginx(配合X-Accel-Redirect机制下载文件)
优点:传输快、服务器IO低
缺点:需要nginx配置权限,另外后端无法知道传完了没有,没有后续操作空间
二、什么是 X-Sendfile?
X-Sendfile是一种将文件下载请求由后端应用转交给前端web服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下。
X-Sendfile 通过一个特定的 header 来实现:在 X-Sendfile 头中指定一个文件的地址来通告前端 web 服务器。当 web 服务器检测到后端发送的这个 header 后,它将忽略后端的其他输出,而使用自身的组件(包括 缓存头 和 断点重连 等优化)机制将文件发送给用户。
不过,在使用 X-Sendfile 之前,我们必须明白这并不是一个标准特性,在默认情况下它是被大多数 web 服务器禁用的。而不同的 web 服务器的实现也不一样,包括规定了不同的 X-Sendfile 头格式。如果配置失当,用户可能下载到 0 字节的文件。
使用X-Sendfile的缺点是你失去对文件传输机制的控制,后台不知道文件是否下载成功。
三、X-Sendfile在nginx中的应用
Nginx 默认支持该特性
,不需要加载额外的模块。只是实现有些不同,
需要发送的 HTTP 头为 X-Accel-Redirect。
X-Accel-Redirect:
需要在nginx配置:
当向django view函数发起request时,django负责对用户权限进行判断或者做些其它事情,然后向nginx转发url为/protected_files/filename的请求,nginx服务器负责文件/var/www/protected_files/filename的下载
四、案例?
Django(做权限判断)+nginx(配合X-Accel-Redirect机制下载文件)
代码实现:
Nginx配置:
python代码:
如果直接访问路径:http://192.168.11.135:8099/download/07a949d969cea243f8755f72d741ae69729e2fa1.img,就会报404错误,因为internal;
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 6:15:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |