关于upstream的八种回调方法
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方法)
相关文章:

关于upstream的八种回调方法
1 creat_request调用背景:用于创建自己模板与第三方服务器的第一次连接步骤1) 在Nginx主循环(ngx_worker_process_cycle方法) 中,会定期地调用事件模块, 以检查是否有网络事件发生。2) 事件模块…...

0303泰勒公式-微分中值定理与导数的应用
文章目录1 引入2 泰勒中值定理2.1 泰勒多项式3.2 泰勒中值定理13.3 泰勒中值定理22.4 误差估计4 麦克劳林公式5 常见麦克劳林公式6 泰勒公式相关例题6.1 将函数展成指定的泰勒公式6.1.1 公式法6.1.2 间接展法(变量替换)6.2 利用泰勒公式求极限6.3 确定无…...

日常运维基础命令
commandexplainps -f -u user_name显示指定用户的进程ps aux --sort-pcpu,pmem先以cpu使用量进行排序,cpu使 用一样,以内存使用率排序ps -ef --forest显示ACLII进程数ps --ppid 28208显示父进程的子进程ps -p 14447 -L显示进程的线程ps -e -o pid&#x…...

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

ES-倒排索引BKD原理skiplist
1.Elasticsearch数据存储结构FST、skiplist、BKD-tree、LSM-tree Elasticsearch数据结构存储流程_善思的博客-CSDN博客_elasticsearch 数据结构 number?keyword?傻傻分不清楚 - Elastic 中文社区 ElasticSearch实战(六)-Skip List 跳表算法…...

每天一道大厂SQL题【Day12】微众银行真题实战(二)
每天一道大厂SQL题【Day12】微众银行真题实战(二) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…...

带您了解TiDB MySQL数据库中关于日期、时间的坑
带您了解TiDB & MySQL数据库中关于日期、时间的坑时间的基础知识什么是时间计算时间的几种方法世界时(UT)协调世界时(UTC)国际原子时(TAI)时区的概念中国所在的时区操作系统的时区datetimedatectl数据库…...

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和
最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

harbor 仓库迁移升级
harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备:安装docker详见:docker 的介绍和部署,并下载docker-compose详见:docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…...

评论功能设计思路~
文章目录 评论功能设计框架1、定义2、目标3、动机4、评论类别**5、评论互动****6、评论区展示结构****6.1 主题式****6.2 平铺式****6.3 盖楼式****7、评论排序机制****8、评论加载形式****9、其他**结语评论功能设计框架 1、定义 评论是指针对于事物进行主观或客观的自我印象…...

算法训练营 day52 动态规划 买卖股票的最佳时机系列1
算法训练营 day52 动态规划 买卖股票的最佳时机系列1 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票…...

3.基于分割的文本检测算法--DBNet++
文章目录1.概况2.DBNet中的主要方法2.1 网络结构2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)3.ASF模块的源码实现参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.概况 2022年02月份论文:Real-Time S…...

IOS打包、SDK接入记录等
IOS打包、SDK接入记录等 Mac上安装HCLR路径 /Applications/Unity/Hub/Editor/2019.4.40f1c1/Unity.app/Contents/il2cpp HCLR 指定4.40是要Unity启动打开的il2cpp,否则HCLR Installer他会报找不到MonoBleedingEdge Mac删除证书 只能点击钥匙串做上角的登录后&…...

【C++】类与对象(引入)
目录 前言 类的引入 类的定义 封装与访问限定符 封装 访问限定符 类的实例化 类的大小 this指针 特性 前言 🎶我们都知道,C语言是面向过程的编程,而C是面向对象的编程,更多体现在编程的关注点上。 🎶就拿洗…...

Redis 高级数据类型
文章目录一、Bitmaps:属性状态统计二、HyperLogLog:基数统计三、GEO:地理位置信息计算提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、Bitmaps:属性状态统计 Bitmaps类型: 统计一…...

Java8 新特性-函数式接口
什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start();再来看看使用了函数式接口是怎么写的 Thread t2 new Thread(() -> System.out.println(&…...

这套软件测试试卷能打90分,直接入职字节吧
目录 一.填空 二、 判断题(正确的√,错误的╳)共10分,每小题1分 三、数据库部分:(共15分) 四、设计题。本题共 1 小题,满分 20分 一.填空 1、 系…...

GUI可视化应用开发及Python实现
0 建议学时 4学时,在机房进行 1 开发环境安装及配置 1.1 编程环境 安装PyCharm-community-2019.3.3 安装PyQt5 pip install PyQt5-tools -i https://pypi.douban.com/simple pip3 install PyQt5designer -i https://pypi.douban.com/simple1.2 环境配置 选择“…...

【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)
一、论文简述 1. 第一作者:Haofei Xu 2. 发表年份:2022 3. 发表期刊:CVPR oral 4. 关键词:光流、代价体、Transformers、全局匹配、注意力机制 5. 探索动机:过去几年中具有代表性的光流学习框架的核心估计方式没有…...

【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析
第三章 业务报表分析 一般的系统需要使用报表来展示公司的运营情况、 数据情况等,本章节对数据进行一些常见报表的开发,广告数据业务报表数据流向图如下所示: 具体报表的需求如下: 相关报表开发说明如下: 第一、数据…...

力扣-删除重复的电子邮箱
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:196. 删除重复的电子邮箱二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...

git基础
git-note Github Manual | GitHub Cheat Sheet | Visual Git Cheat Sheet 安装配置工具分支创建仓库.gitignore文件同步更改进行更改重做提交术语表 安装 desktop.github.com | git-scm.com 配置工具 对所有本地仓库的用户信息进行配置 对你的commit操作设置关联的用户名…...

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

JVM优化常用命令
jps列出正在运行的虚拟机进程jpstop列出线程CPU或内存占用top top -Hp pid //列出pid全部线程jstat监视虚拟机运行状态信息jstat -gc pid 5000 //每隔5s打印gc情况jmapjmap -heap pid //输出jvm内存情况 jmap -histo:live pid | more //查看堆内存中的对象数量和大小 jma…...

按键中断实验
gpio.c#include"gpio.h"//给gpio使能和设置为输入模式void hal_gpio_init(){//使能GPIOF控制器RCC->MP_AHB4ENSETR|(0x1<<5);//通过GPIOF_将pf9/pf7/pf8设置为输入模式 GPIOF->MODER&(~(0x3<<18));GPIOF->MODER&(~(0x3<<14));GPI…...

kubernetes入门介绍,从0到1搭建并使用
Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目,是一个容器编排系统,可以自动化部署、…...

【C语言进阶】字符串函数与内存函数的学习与模拟实现
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C语言进阶 🎯长路漫漫浩浩,万事皆有期待 文章目录1.字符串处理函数介…...

【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 普通的互斥锁 vs 读写锁 1.3 重量级锁 vs 轻量级锁 1.4 自旋锁 vs 挂起等待锁 1.5 公平…...

Linux基础命令-pstree树状显示进程信息
Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…...

keepalived+LVS配置详解
keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…...