导航

nginx 的模块及处理流程

Posted on 2013-10-11 11:37  蝈蝈俊  阅读(3667)  评论(0编辑  收藏  举报

     nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。这样的模块化设计类似于面向对象中的接口类,它增强了nginx源码的可读性、可扩充性和可维护性。

nginx的4种角色模块

Nginx模块主要有4种角色:
    (1) core(核心模块):构建nginx基础服务、管理其他模块。
    (2) handlers(处理模块): 用于处理HTTP请求,然后产生输出。
    (3) filters(过滤模块): 过滤handler产生的输出。
    (4) load-balancers(负载均衡模块):当有多于一台的后端备选服务器时,选择一台转发HTTP请求。

Nginx的核心模块主要负责建立nginx服务模型、管理网络层和应用层协议、以及启动针对特定应用的一系列候选模块。

其他模块负责分配给web服务器的实际工作:

  • 当Nginx发送文件或者转发请求到其他服务器,由handlers(处理模块)或load-balancers(负载均衡模块)提供服务;
  • 当需要Nginx把输出压缩或者在服务端加一些东西,由filters(过滤模块) 提供服务。
     

模块是如何被调用的?

当服务器启动,每个handlers(处理模块)都有机会映射到配置文件中定义的特定位置(location);
如果有多个handlers(处理模块)映射到特定位置时,只有一个会“赢”(说明配置文件有冲突项,应该避免发生)。
处理模块以三种形式返回:

  • OK、
  • ERROR、
  • 或者放弃处理这个请求而让默认处理模块来处理(主要是用来处理一些静态文件,事实上如果是位置正确而真实的静态文件,默认的处理模块会抢先处理)。


如果handlers(处理模块)把请求反向代理到后端的服务器,就变成另外一类的模块:load-balancers(负载均衡模块)。
负载均衡模块的配置中有一组后端服务器,当一个HTTP请求过来时,它决定哪台服务器应当获得这个请求。
Nginx的负载均衡模块采用两种方法:

  • 轮转法,它处理请求就像纸牌游戏一样从头到尾分发;
  • IP哈希法,在众多请求的情况下,它确保来自同一个IP的请求会分发到相同的后端服务器。


如果handlers(处理模块)没有产生错误,filters(过滤模块)将被调用。
多个filters(过滤模块)能映射到每个位置,所以(比如)每个请求都可以被压缩成块。它们的执行顺序在编译时决定。
filters(过滤模块)是经典的“接力链表(CHAIN OF RESPONSIBILITY)”模型:一个filters(过滤模块)被调用,完成其工作,然后调用下一个filters(过滤模块),直到最后一个filters(过滤模块)。Nginx完成这个回复。
过滤模块链的特别之处在于,

  • 每个filters(过滤模块)不会等上一个filters(过滤模块)全部完成;
  • 它能把前一个过滤模块的输出作为其处理内容;有点像Unix中的流水线。

过滤模块能以buffer(缓冲区)为单位进行操作,这些buffer一般都是一页(4K)大小,当然你也可以在nginx.conf文件中进行配置。这意味着,比如,模块可以压缩来自后端服务器的回复,然后像流一样的到达客户端,直到整个回复发送完成。
总之,过滤模块链以流水线的方式高效率地向客户端发送响应信息。

nginx模块处理流程


  所以总结下上面的内容,一个典型的处理周期是这样的:
  客户端发送HTTP请求 –> Nginx基于配置文件中的位置选择一个合适的处理模块 ->(如果有)负载均衡模块选择一台后端服务器 –> 处理模块进行处理并把输出缓冲放到第一个过滤模块上 –> 第一个过滤模块处理后输出给第二个过滤模块 –> 然后第二个过滤模块又到第三个 –> 依此类推 –> 最后把回复发给客户端。   

下图展示了nginx模块处理流程。

28235112-304f50f64d424af1972af24a2383c4cf

 

 

 

参考资料:

结合源码看nginx-1.4.0之nginx模块组织结构详解
http://www.cnblogs.com/didiaoxiong/p/3209767.html