Nginx请求执行阶段

标签: nginx 阶段 | 发表时间:2015-11-09 17:02 | 作者:on__the__way
出处:http://www.iteye.com

    Nginx在处理请求时,按照不同的阶段依次处理,常见的阶段如rewrite、access和content依次执行。Nginx中的指令一般只注册在某一个阶段,如echo注册在content阶段,set注册在rewrite阶段,因此set总是在echo之前执行,与书写顺序无关。特殊的,geo和map指令与处理阶段无关,它们是声明性的。

    1,rewrite阶段

    rewrite中的指令可以混合执行,如set、set_by_lua等,set_by_lua将计算结果赋予变量,如set_by_lua $c "return ngx.var.a + ngx.var.b"。ngx.var.VARIABLE 接口来读取 Nginx 变量 $VARIABLE,将a和b的和赋给c,特殊的当由于nginx中变量只能是字符串,而在lua中若a和b是数字的则会转换为数值类型再求和,转换为字符串赋给c。这些第三方模块注入到rewrite的指令序列中,而其他模块岁也在rewrite阶段,但和ngx_rewrite的指令分开执行,即使运行在同一个请求处理阶段,分属不同模块的配置指令也可能会分开独立运行。rewrite_by_lua指令也运行在rewrite阶段的末尾。

    2,access阶段

    执行在rewrite之后的access阶段的任务主要是执行访问控制的任务,如检查用户权限及IP合法性等。ngx_access的指令按顺序执行,直到遇到第一条满足的条件指令为止就不执行allow和deny。allow若先匹配则执行后续其他模块的指令,若deny先匹配则返回403。

    ngx_lua模块的accessby_lua执行在access阶段,与rewrite_by_lua类似执行在access的末尾。可通过嵌入的lua代码执行较复杂的验证过程。执行效率较ngx_lua慢。

    3,content阶段

    执行在access之后的content阶段任务是生成响应内容并输出HTTP响应。如echo指令,echo_ecxec,proxy_pass,echo_location及content_by_lua都运行在此阶段。注意,与rewrite和access阶段不同,content阶段不同模块的配置指令不能一起混合使用。向 content 阶段注册配置指令本质上是在当前的 location 配置块中注册所谓的“内容处理程序”。而每一个 location 只能有一个“内容处理程序”,因此,当在 location 中同时使用多个模块的 content 阶段指令时,只有其中一个模块能成功注册“内容处理程序”。所以应当避免在同一个 location 中使用多个模块的 content 阶段指令。

    content阶段包含三个静态资源服务模块,ngx_index,ngx_autoindex,ngx_static用于当在location未使用任何content阶段的指令时处理URL请求。ngx_index和ngx_autoindex只作用于已/结尾的URI,其他由ngx_static执行。

    ngx_index使用index指令用于查找首页文件,配合root指令实现,当找到文件后触发内部跳转而不是直接返回该文件,若都不存在则返回403。ngx_autoindex用于开启目录索引autoindex on,当index指定的首页文件不存在时返回该目录索引。   

    ngx_static处理所有的静态资源的请求,    /VAR/WWW/目录下有index.html文件,如:

    location / {

        root /var/www/;

    }

    当请求index.html时,该location匹配上,并最终由ngx_static处理,返回该index.html。若没有root指定根目录,则使用安装nginx时使用的--prefix目录.

    4,其他阶段

    Nginx的执行顺序为post-read、 server-rewrite、 findconfig、 rewrite、 post-rewrite、 preaccess、 access、 post-access、 try-files、 content 以及 log。

  • post-read阶段。在nginx读取并解析完请求头之后立即执行,支持其他模块的注册,如ngx_realip 使Nginx 认为当前请求的来源地址是指定的某一个请求头的值。 set_real_ip_from指定来源的IP, real_ip_header更改的请求头。常用于当请求经过某一代理后其来源IP都为代理IP,一般会在代理之前把真实的IP放在HTP请求头中,再通过ngx_realip恢复。
  • 写在server而不是location中的rewrite指令运行在该阶段。如set
  • find-config不支持Nginx模块注册处理程序,由于Nginx核心完成请求与location的配对工作。
  • post-rewrite阶段不支持Nginx模块注册处理程序,完成内部跳转。内部跳转本质上是把当前请求的处理阶段强行倒退到find-config节点使url与location重新匹配。
  • preaccess阶段的ngx_limit_req用于控制请求的访问频度, ngx_limit_zone 用于控制访问的并发度。注册在location中的realip模块也在该阶段运行。
  • post-access阶段。不支持模块注册,主要用于配合access实现标准 ngx_http_core 模块提供的配置指令 satisfy 的功能。satisfy用于access阶段注册的模块是and还是or验证。satisfy all/any。
  • try-files阶段,后跟N各参数,Nginx按顺序检查前N-1个参数对应的文件是否存在,若存在则改写URI(不包含末尾的斜杠/),否则使用第N各参数内部跳转,而不检查对应的文件是否存在。最后一个参数也可为直接返回的状态码。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [nginx 阶段] 推荐:

Nginx请求执行阶段

- - 操作系统 - ITeye博客
    Nginx在处理请求时,按照不同的阶段依次处理,常见的阶段如rewrite、access和content依次执行. Nginx中的指令一般只注册在某一个阶段,如echo注册在content阶段,set注册在rewrite阶段,因此set总是在echo之前执行,与书写顺序无关. 特殊的,geo和map指令与处理阶段无关,它们是声明性的.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环境可以使用以下指令. centos平台编译环境使用如下指令. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩.

Nginx GZip 压缩

- - 开心平淡对待每一天。热爱生活
  Nginx GZip 模块文档详见: http://wiki.nginx.org/HttpGzipModule 常用配置片段如下:. # 压缩比例,比例越大,压缩时间越长. 默认是1 gzip_types. text/css text/javascript; # 哪些文件可以被压缩 gzip_disable.

Nginx 限流

- - 鸟窝
电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单、信誉分析,进而根据用户ip信誉权重做相应的流量拦截、限制流量. Nginx自身有的请求限制模块 ngx_http_limit_req_module、流量限制模块 ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. 基于HTTP的FLV/MP4 VOD点播. HLS (HTTP Live Streaming) M3U8的支持. 基于http的操作(发布、播放、录制). 可以很好的协同现有的流媒体服务器以及播放器一起工作.

Nginx content cache Nginx内容缓存

- - CSDN博客推荐文章
原文地址: http://nginx.com/resources/admin-guide/caching/. When caching is enabled NGINX saves responses in the cache on the disk and uses them to respond to clients without proxying the requests..

nginx + memcached session 同步

- - 企业架构 - ITeye博客
squid 缓存疑问 问题归纳:. 1 squid 缓存的数据,何时过期,如何判断缓存的数据已经过期,如何把最新的数据缓入squid 并且替换掉旧的内容. 2 如何判断数据是否应该被缓存. 3 校验失败时,是否给出缓存中旧的内容. 上面的几个问题  都可以通过 squid中的 refresh_pattern 配置项 找到答案.

nginx日志切割

- - haohtml's blog
nginx的日志文件没有rotate功能. 如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件. 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志. 在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件.

nginx框架总结

- - CSDN博客互联网推荐文章
a、内存池的设计,为一个多级链表结构,本身不负责内存的回收,减少内存碎片,提高内存的利用率,将多次向操作系统申请内存压缩为一次,减少向操作系统申请内存的次数,提高cpu资源的利用;. b、基于事件的master-worker异步处理. 处理事件的机制是由事件分发进程加载事件处理模块来完成与传统将事件提交给handle-thread来处理的方式相比,减少了进程(线程)间的切换,从而降低了请求响应延迟的时间;.