• nginx 的模块及处理流程


         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

  • 相关阅读:
    MYSQL 神奇的操作insert into test select * from test;
    mysql innodb与myisam存储文件的区别
    centos 普通用户 和 root 相互切换方法
    MySQL
    mysql查看数据库表数量
    PHP是单线程还是多线程?
    PHP如何解决网站大流量与高并发的问题(一)
    PHP如何解决网站大流量与高并发的问题(二)
    Work at home, Work as a distributed team | TVP思享
    区块链上的虚拟开放世界游戏是怎样的?| TVP思享
  • 原文地址:https://www.cnblogs.com/ghj1976/p/3363039.html
Copyright © 2020-2023  润新知