X-accel模块允许由后台通过返回的头来决定投递静态文件。为什么要这么做呢?试想一下我们经常碰到的这种情况,在有的论坛中,下载资源需要登录认证、权限核查、积分扣除或者是积分增加等等,对于Nginx来说这些细粒度的控制其本身无法完成,因此需要应用程序来完成,当应用程序完成这些操作后,根据实际情况会做出选择,如果条件满足那么开始下载所要获取的静态资源(文件),注意,这是由动态的程序提供下载,对于动态程序来说,这是一个弱点,而对于Nginx来说,这是它的强项,那么在这种形式下能不能让Nginx来完成静态资源的下载呢?答案是可以的。但我们为什么有必要这么做呢?答案在于Nginx在打开静态文件上使用了sendfile(2),因此其IO效率非常之高。

处理流程

具体的处理流程是:

-------------------------

|"GET /dd/filename  |

|                           |

∨                          |

客户端请求----------->Nginx----->Backend(Apache、Tomcat、FastCGI,……)

∧                                                                |

|                                                                 |

|  X-Accel-Redirect: /files/filename                   |

|_______________________________________|

我们从这个流程图中不难看出在客户端的请求被转向后台服务器时,服务器并没有为客户端返回实际要下载的资源(而是去做了其它的验证或者是其它的工作)而是使用了X-Accel-Redirect头将下载的资源又传递给了Nginx,最后又是通过Nginx服务器处理该请求发送给客户端。

这种功能就是我们说的X-Sendfile,在Nginx中由X-Accel-Redirect来完成,在后台服务器将下载的请求抛给Nginx后,那么后台的服务器又可以承接其它的活进而处理其它的请求了,因此大大的减轻了后端服务器的压力。

相对于其它的Nginx来说,X-accel模块与其它标准的Nginx模块有所不同,它的实现不是依赖于指令而是依赖于在特定方式下后台(或者叫上游)服务器发回的请求头,它的方法我们在前面也了解到了,就是通过发送一个带有URI的x-accel-redirect头,Nginx将会将这个请求作为正常(这里的正常就是指就像是使用浏览器一样的请求)的请求来处理这个请求,然后根据这个URI进行location匹配,然后是请求文件的匹配,最终实现的是在后端服务器返回的请求头中:“root + URI”与Nginx中location匹配,这里的“root”,我们以PHP程序为例:

header("X-Accel-Redirect: /files/" . $path);

就是我们这个PHP程序中的“/files/”部分,而URI则是“$path”部分。在这里我们就了解到这里,在后面的例子会证实这一点。

另外,还需要注意一点,由于Nginx服务器只认识从后端服务器发来的X-Accel-Redirect头,而从客户端发来的这种头,它并不理睬。

配置示例

# Will serve /var/www/files/myfile.tar.gz

# When passed URI /protected_files/myfile.tar.gz

location /protected_files {

internal;

alias /var/www/files;

}

# Will serve /var/www/protected_files/myfile.tar.gz

# When passed URI /protected_files/myfile.tar.gz

location /protected_files {

internal;

root /var/www;

}

You can also proxy to another server.

location /protected_files {

internal;

proxy_pass http://127.0.0.2;

}

Nginx与X-Sendfile的更多相关文章

  1. nginx的sendfile指令的作用

    linux为了解决对读文件产生的从应用空间到内核空间复制数据产生的效率影响引进了零拷贝.什么是零拷贝?这里就不多说了,请参考http://blog.csdn.net/crazyguang/articl ...

  2. Nginx学习笔记--001-Nginx快速搭建

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  3. nginx服务器安装及配置文件详解

    nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...

  4. 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞

    使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...

  5. nginx简易教程

    概述 什么是nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Pr ...

  6. Nginx配置文件nginx.conf中文详解(转)

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  7. Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

    ######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组user www www;#nginx进程数,建议设置为等于CPU总核心数.worker_proc ...

  8. Nginx笔记

    基础篇 关于Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.最早由俄罗斯的程序设计师Igor Sysoev所开发,并在一个BSD-like ...

  9. Nginx配置文件nginx.conf中文详解

    #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...

  10. mac搭建nginx与php

    第一步:关闭Apache及开机启动 要使用nginx,最好停用mac中自带的Apache.停用很简单: sudo launchctl unload -w /System/Library/LaunchD ...

随机推荐

  1. ubuntu获取硬盘的uuid。

    1.用UUID来标识硬盘有很多好处,它是一个硬盘的唯一代号,所以当硬盘插口位置变化时,虽然sda可能会变成sdc,但这个码是不会变的.所以在 fstab中用/dev/sda1这样的硬盘标识可能会有混乱 ...

  2. Oracle 关于定义约束 / 修改表结构 /修改约束

    ---约束分5种:主键 外键 唯一 非空 检查5类约束 Oracle中分列级别约束 与 表级别约束 列级别约束:在创建表时再列上面加约束 例如: create table table11( stuno ...

  3. Python 基础篇:编码、变量、模块

    1. 编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII). 2. 变量 变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数 ...

  4. hdu 1568 Fibonacci 数学公式

    Fibonacci Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到的Fibonacci数列(f[0]=0,f[1]=1;f[i] = ...

  5. 分享零基础学习Hadoop方法

    (我不是Hadoop专家,也只是一个初学者,这里我也只是就自己的学习体会,站在初学者的角度谈一下如何入门.) 首先我觉得应该思考这样一个问题:Hadoop对于我们来讲,是一种工具,那么Hadoop帮助 ...

  6. NGUI系列教程五(角色信息跟随)

    在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...

  7. poj 3667 Hotel (线段树)

    http://poj.org/problem?id=3667 Hotel Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 94 ...

  8. Oracle---->基本DDL

    修改表名: rename table_name1 to table_name2; delete [from] persons where lastname= 'Wilson';

  9. DHTMLX 前端框架 建立你的一个应用程序 教程(九)--绑定表单Form到表格Grrid中

    绑定表单Form到表格Grrid中 现在我们需要选中一行表格数据的时候 数据能在表单中显示出来 我们可以使用DHTMLX 丰富的组件功能实现它. 绑定表单到表格 1.调用bind方法将表单绑定到网格, ...

  10. spin_lock & mutex_lock的区别?

    http://blog.csdn.net/sunnytina/article/details/7615520   为什么需要内核锁? 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是 ...