首页 > 系统相关 >nginx 的模块及处理流程

nginx 的模块及处理流程

时间:2023-06-22 19:36:26浏览次数:55  
标签:模块 处理 流程 nginx 过滤 filters 请求

     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模块处理流程。

 

 

 

参考资料:

结合源码看nginx-1.4.0之nginx模块组织结构详解


标签:模块,处理,流程,nginx,过滤,filters,请求
From: https://blog.51cto.com/u_15588078/6535319

相关文章

  • TreeSaver.js 的工作流程逻辑
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。初始化TreeSaver.js框架的入口源代码在后面可以看到:https://github.com/Treesaver/treesaver/blob/master/src/init.js这里的代码用到了Google开发的JS库:Closur......
  • 【雕爷学编程】Arduino动手做(119)---JQ6500语音模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Nginx 解析漏洞复现、利用
    1、漏洞复现用vulhub复现该漏洞vubhub环境搭建:https://blog.csdn.net/weixin_59679023/article/details/123739030nginx解析漏洞:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/打开终端输入:cdvulhub/nginx/nginx_parsing_vulnerability/sudodocker-co......
  • 【雕爷学编程】Arduino动手做(118)---PS2接口模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • ERROR: nginx-1.22.1 installation failed.
    libraries.Youcaneitherdonotenablethemoduleorinstallthelibraries.make:***Noruletomaketarget'build',neededby'default'.Stop.make:***Noruletomaketarget'install'.Stop.================================......
  • Android系统服务 AMS 启动流程
    背景当SystemServer启动的时候,从Zygote进程fork()出SystemServer进程,经过初始化后,会通过反射调用SystemServer.java的mian()方法,其中会启动一系列系统服务。AMS就是其中的一个。一、缘起SystemServer进程SystemServer的main():/***Themainentrypointfromzygote......
  • 20230428 24. 职责链模式 - 审批流程
    介绍职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Handler类,定义一个处理请示的接口ConcreteHandler类,具体处理者类,处理它所负责的请......
  • 【代码设计】链表结构解决多流程校验
    目的使用合理的代码设计,解决业务场景的中的实际问题。背景介绍在实际的业务场景中,用户的一个操作行为,是否允许真正被执行,往往会涉及到多流程的校验,一旦有条件不满足将会被中止。以下面流程图为例:用户点击了打赏按钮,会进行是否有网络检查,没有网络,会有网络连接弹框,等待用户连接结果......
  • Python | import json模块详解
    json是Python内置的一个用于处理JSON数据的模块。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于Web应用程序之间的数据传输。json模块提供了四个主要的方法:json.dumps()-将Python对象转换为JSON格式的字符串。json.loads()-将JSON格式的字符串转换为Py......
  • nginx-1.22.1版本的rpm包,自己手动打。
    环境准备主机名WanIPLanIP应用角色web0110.0.0.7172.16.1.7fpm打包工具web0210.0.0.8172.16.1.8yumrepoyum仓库web0310.0.0.9172.16.1.9安装rpm包的客户端web01安装fpm打包工具#0.安装依赖[root@web01~]#yuminstall-yrpm-build#1.......