Nginx+PHP Xsendfile文件传输

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+PHP Xsendfile文件传输相关的知识,希望对你有一定的参考价值。

参考技术A

传统的文件传输模式中(read/write和send/recv),需要在文件file,系统buffer和用户buffer中反复I/O,造成内存的浪费与资源占用,大致流程如下.

关于Linux User Mode和Kernel Mode

简单图示:

这样的传输方式固然简单可靠,但是由于一共进行了四次跨space的I/O和四次mode切换,所以在传输size过大或数量过多的文件时效率堪忧.

在Linux 2.0+以后提供了一个 sendfile() 的文件传送方式,
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
文档

其大致流程如下:

以上流程中并没有出现mode的切换,并且省略了涉及 user buffer 的两次I/O,所以性能会比传统方式优异许多.

简单图示:

强烈建议先阅读官方文档:
XSendfile-nginx官方文档

需要注意的是:

Apache2 Xsendfile mod
DEMO

如何在亚马逊 linux ami 上为 httpd 2.4 安装 xsendfile?

【中文标题】如何在亚马逊 linux ami 上为 httpd 2.4 安装 xsendfile?【英文标题】:How to install xsendfile for httpd 2.4 on amazon linux ami? 【发布时间】:2014-03-29 18:23:39 【问题描述】:

如何在 amazon linux ami 上为 httpd 2.4 安装 xsendfile? amazon 和 epel 的默认软件包存储库没有 httpd 2.4 的软件包,仅适用于 httpd 2.2。如果可能的话,我宁愿不编译模块。谢谢。

【问题讨论】:

【参考方案1】:

在编写此答案时,我不知道在 EC2 实例上为 X-sendfile for Apache24 快速安装 Yum/apt-get 样式,但是编译和安装您自己的模块非常容易:

准备工作

mod_xsendfile.c下载部分下面的链接

https://tn123.org/mod_xsendfile/

安装 GCC 进行编译

sudo yum install gcc

apxs 需要 httpd24-devel

sudo yum install httpd24-devel.x86_64

编译安装

sudo apxs -cia mod_xsendfile.c

编辑你的 http.conf 添加

<IfModule mod_xsendfile.c>
  XSendFile on
  XSendFilePath /home/path/to/private/files/to/serve/
</IfModule>

重启 Apache24

sudo service httpd restart

完成!

检查您的 phpinfo 或 apache_modules() 以确认一切正常并根据您的喜好修改设置。 享受高效的下载:)

【讨论】:

以上是关于Nginx+PHP Xsendfile文件传输的主要内容,如果未能解决你的问题,请参考以下文章

如何在亚马逊 linux ami 上为 httpd 2.4 安装 xsendfile?

使用 ffmpeg 和 nginx 实时流式传输 .webm 文件

PHP大文件分片上传/多线程上传

PHP大文件分片上传/多线程上传

nginx 只让php入口文件访问,其他php文件禁止直接访问

java 怎么向nginx web服务器传输文件