关于upstream的八种回调方法

news/2024/4/20 10:26:28/文章来源:https://blog.csdn.net/qq_62309585/article/details/129163248

1 creat_request

调用背景:

用于创建自己模板与第三方服务器的第一次连接

步骤

1) 在Nginx主循环(ngx_worker_process_cycle方法) 中,会定期地调用事件模块, 以检查是否有网络事件发生。

2) 事件模块在接收到HTTP请求后会调用HTTP框架来处理。 假设接收、 解析完HTTP头部后发现应该由mytest模块处理, 这时会调用mytest模块的ngx_http_mytest_handler来处理。

3) 这里mytest模块此时会完成

3.1设置upstream的限制性参数

3.2设置需要访问的第三方服务器地址

3.3设置回调方法 具体细节参照如何使用ngxin的 upstream_编程界的谢菲尔德的博客-CSDN博客

4) 调用ngx_http_upstream_init方法启动upstream。

5) upstream模块会去检查文件缓存, 如果缓存中已经有合适的响应包, 则会直接返回缓存( 当然必须是在使用反向代理文件缓存的前提下) 。 为了让读者方便地理解upstream机制, 将不再提及文件缓存。

6) 回调mytest模块已经实现的create_request回调方法。

7) mytest模块通过设置r->upstream->request_bufs已经决定好发送什么样的请求到上游服务器。

8) upstream模块将会检查的resolved成员, 如果有resolved成员的话, 就根据它设置好上游服务器的地址r->upstream->peer成员。

9) 用无阻塞的TCP套接字建立连接。

10) 无论连接是否建立成功, 负责建立连接的connect方法都会立刻返回。

11) ngx_http_upstream_init返回。

12) mytest模块的ngx_http_mytest_handler方法返回NGX_DONE。

13) 当事件模块处理完这批网络事件后, 将控制权交还给Nginx主循环。

2. reinit_request回调方法

调用背景

reinit_request可能会被多次回调。 它被调用的原因只有一个, 就是在第一次试图向上游服务器建立连接时, 如果连接由于各种异常原因失败, 那么会根upstream中conf参数的策略要求再次重连上游服务器, 而这时就会调用reinit_request方法

步骤

1) Nginx主循环中会定期地调用事件模块, 检查是否有网络事件发生。

2) 事件模块在确定与上游服务器的TCP连接建立成功后, 会回调upstream模块的相关方法处理。

3) upstream模块这时会把r->upstream->request_sent标志位置为1, 表示连接已经建立成功

了, 现在开始向上游服务器发送请求内容。

4) 发送请求到上游服务器。

5) 发送方法当然是无阻塞的(使用了无阻塞的套接字) , 会立刻返回。

6) upstream模块处理第2步中的TCP连接建立成功事件。

7) 事件模块处理完本轮网络事件后, 将控制权交还给Nginx主循环。

8) Nginx主循环重复第1步, 调用事件模块检查网络事件。

9) 这时, 如果发现与上游服务器建立的TCP连接已经异常断开, 那么事件模块会通知upstream模块处理它。

10) 在符合重试次数的前提下, upstream模块会毫不犹豫地再次用无阻塞的套接字试图建立连接。

11) 无论连接是否建立成功都立刻返回。

12) 这时检查r->upstream->request_sent标志位, 会发现它已经被置为1了。

13) 如果mytest模块没有实现reinit_request方法, 那么是不会调用它的。 而如果reinit_request不为NULL空指针, 就会回调它。

14) mytest模块在reinit_request中处理完自己的事情。

15) 处理完第9步中的TCP连接断开事件, 将控制权交还给事件模块。

16) 事件模块处理完本轮网络事件后, 交还控制权给Nginx主循环

3 finaliza_request回调方法

调用背景

当调用ngx_http_upstream_init启动upstream机制后, 在各种原因( 无论成功还是失败) 导致该请求被销毁前都会调用finalize_request方法

4 process_header 回调方法

调用背景:

process_header是用于解析上游服务器返回的基于TCP的响应头部的, 因此,

process_header可能会被多次调用, 它的调用次数与process_header的返回值有关如果process_header返回NGX_AGAIN, 这意味着还没有接收到完整的响应头部, 如果再次接收到上游服务器发来的TCP流, 还会把它当做头部, 仍然调用process_header处理,而在下图中, 如果process_header返回NGX_OK( 或者其他非NGX_AGAIN的值) , 那么在这次连接的后续处理中将不会再次调用process_header。

步骤:

1) Nginx主循环中会定期地调用事件模块, 检查是否有网络事件发生。

2) 事件模块接收到上游服务器发来的响应时, 会回调upstream模块处理。

3) upstream模块这时可以从套接字缓冲区中读取到来自上游的TCP流。

4) 读取的响应会存放到r->upstream->buffer指向的内存中。 注意: 在未解析完响应头部前, 若多次接收到字符流, 所有接收自上游的响应都会完整地存放到r->upstream->buffer缓冲区中。 因此, 在解析上游响应包头时, 如果buffer缓冲区全满却还没有解析到完整的响应头部( 也就是说, process_header一直在返回NGX_AGAIN) , 那么请求就会出错。

5) 调用mytest模块实现的process_header方法。

6) process_header方法实际上就是在解析r->upstream->buffer缓冲区, 试图从中取到完整的响应头部( 当然, 如果上游服务器与Nginx通过HTTP通信, 就是接收到完整的HTTP头

7) 如果process_header返回NGX_AGAIN, 那么表示还没有解析到完整的响应头部, 下次还会调用process_header处理接收到的上游响应。

8) 调用无阻塞的读取套接字接口。

9) 这时有可能返回套接字缓冲区已经为空。

10) 当第2步中的读取上游响应事件处理完毕后, 控制权交还给事件模块。

11) 事件模块处理完本轮网络事件后, 交还控制权给Nginx主循环。

5.rewrite_redirect

调用背景:

在重定向URL阶段, 如果实现了rewrite_redirect回调方法, 那么这时会调用

rewrite_redirect.如果upstream模块接收到完整的上游响应头部,

而且由HTTP模块的process_header回调方法将解析出的对应于Location的头部设置到了ngx_http_upstream_t中的headers_in成员时,ngx_http_upstream_process_headers方法将会最终调用rewrite_redirect方法

url重定向:url 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持(原有)链接可用的技术。HTTP 协议提供了一种特殊形式的响应—— HTTP 重定向(HTTP redirects)来执行此类操作

6.input_filter_init与input_filter回调方法

调用背景:

input_filter_init与input_filter这两个方法都用于处理上游的响应包体, 因为处理包体前HTTP模块可能需要做一些初始化工作。 例如, 分配一些内存用于存放解析的中间状态等,这时upstream就提供了input_filter_init方法。 而input_filter方法就是实际处理包体的方法。 这两个回调方法都可以选择不予实现, 这是因为当这两个方法不实现时, upstream模块会自动设置它们为预置方法(上文讲过, 由于upstream有3种处理包体的方式, 所以upstream模块准备了3input_filter_init、 input_filter方法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72694.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人员行为识别系统 TensorFlow

人员行为识别系统人员行为识别系统通过TensorFlow深度学习技术,人员行为识别算法对画面中区域人员不按要求穿戴、违规抽烟打电话、睡岗离岗以及作业流程不规范实时分析预警,发现违规行为立即抓拍告警。深度学习应用到实际问题中,一个非常棘手…

快速读懂网络拓扑图

快速读懂网络拓扑图几重常见的网络拓扑总线型拓扑简介优点缺点环型拓扑简介优点缺点星型拓扑简介优点缺点网络层级机构节点结点链路通路不同的连接线代表什么意思?不同颜色、粗细的直线代表什么意思?闪电线-串行链路几重常见的网络拓扑 总线型拓扑 简介…

浅谈volatile关键字

文章目录1.保证内存可见性2.可见性验证3.原子性验证4.原子性问题解决5.禁止指令重排序6.JMM谈谈你的理解6.1.基本概念6.2.JMM同步规定6.2.1.可见性6.2.2.原子性6.2.3.有序性6.3.Volatile针对指令重排做了啥7.你在哪些地方用过Volatile?volatile是Java提供的轻量级的…

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【Git】Git的分支操作

目录 4、 Git 分支操作 4.1 什么是分支 4.2 分支的好处 4.3 分支的操作 4、 Git 分支操作 4.1 什么是分支 在版本控制过程中, 同时推进多个任务, 为每个任务, 我们就可以创建每个任务的单独分支。 使用分支意味着程序员可以把自己的工作…

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock(轻量级锁)是由SpinLock实现,主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式,一种为排他模式,另一种是共享模式,如果想要读取共享内存中的内容,需要在读取…

面试之设计模式(简单工厂模式)

案例 在面试时,面试官让你通过面对对象语言,用Java实现计算器控制台程序,要求输入两个数和运算符号,得出结果。大家可能想到是如下: public static void main(String[] args) {Scanner scanner new Scanner(System.…

BERT模型系列大全解读

前言 本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据上下文单词来预测这些单词,从…

F.pad() 函数

F.pad() 对tensor 进行扩充的函数。 torch.nn.functional.pad (input, pad, mode‘constant’, value0) input:需要扩充的 tensor,可以是图像数据,亦或是特征矩阵数据;pad:扩充维度,预先定义某维度上的扩充…

到了35岁,软件测试职业发展之困惑如何解?

35岁,从工作时间看,工作超过10年,过了7年之痒,多数IT人都已经跳槽几次。 35岁,发展比较好的软件测试人,已经在管理岗位(测试经理甚至测试总监)或已经成为测试专家或测试架构师。发展…

Head First设计模式---4.工厂方法模式

2.1工厂方法模式 亦称: 虚拟构造函数、Virtual Constructor、Factory Method 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 [外链图片转存失败,源站可能有防盗链机制,建议将图片…

掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

文章目录什么是广播表广播表实战数据库配置表Java配置实体类配置文件测试广播表水平分库分表配置文件运行测试什么是绑定表?绑定表实战配置数据库配置Java实体类配置文件运行测试水平分库分表后的查询和删除操作查询操作什么是广播表 指所有的分片数据源中都存在的…

2023该好好赚钱了,推荐三个下班就能做的副业

在过去的两年里,越来越多的同事选择辞职创业。许多人通过互联网红利赚到了他们的第一桶金。随着短视频的兴起,越来越多的人吹嘘自己年收入百万,导致很多刚进入职场的年轻人逐渐迷失自我,认为钱特别容易赚。但事实上,80…

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World (一)依赖导入 (二)消息生产者 (三)消息消费者 三、实现轮训分发消息 (一)抽取工具类 (二)启…

零基础机器学习做游戏辅助第十四课--原神自动钓鱼(四)yolov5目标检测

一、yolo介绍 目标检测有两种实现,一种是one-stage,另一种是two-stage,它们的区别如名称所体现的,two-stage有一个region proposal过程,可以理解为网络会先生成目标候选区域,然后把所有的区域放进分类器分类,而one-stage会先把图片分割成一个个的image patch,然后每个im…

【微信小程序】--JSON 配置文件作用(三)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…

二叉树、二叉搜索树、二叉树的最近祖先、二叉树的层序遍历【零神基础精讲】

来源0x3f:https://space.bilibili.com/206214 文章目录二叉树[104. 二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)[111. 二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/)[129. 求根节点到叶节点…

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…

XC7K70T-1FBG676C应用XC7K70T-L2FBG484E Kintex-7, FPGA 规格参数

概述Kintex-7 FPGA为快速增长应用和无线通信提供最优性价比和低功耗。Kintex-7 FPGA允许设计人员构建卓越带宽和12位数字可编程模拟,同时满足成本和功耗要求。144GMACS数字信号处理器 (DSP) 的独特功耗使得多功能Kintex-7器件成为便携式超声波设备和下一代通信等应用…

文案女王彭芳如何转变为“百万发售系统”创始人?我们来探个究竟!

智多星老师 她的输出跟智多星老师几乎毫无二致,是抄袭还是纯属巧合呢? 你们问的这个问题我也想知道,为了了解真相,我让我的一个学生把那个叫“彭芳老师”的视频给我看,当看到她的简介时,我非常震惊&#…