http的请求上下文

news/2024/4/26 3:30:40/文章来源:https://blog.csdn.net/qq_62309585/article/details/129124787

1.引入:

上下文是指HTTP框架为每个HTTP请求所准备的结构体。 HTTP框架定义的这个上下文是针对于HTTP请求的, 而且一个HTTP请求对应于每一个HTTP模块都可以有一个独立的上下文结构体(并不是一个请求的上下文由所有HTTP模块共用) 。

2.概述:

1.简单地讲, 就是在一个请求的处理过程中, 用类似struct这样的结构体把一些关键的信息都保存下来, 这个结构体可以称为请求的上下文。 每个HTTP模块都可以有自己的上下文结构体, 一般都是在刚开始处理请求时在内存池上分配它, 之后当经由epoll、HTTP框架再次调用到HTTP模块的处理方法时, 这个HTTP模块可以由请求的上下文结构体中获取信息。 请求结束时就会销毁该请求的内存池, 自然也就销毁了上下文结构体。 以上就是HTTP请求上下文的使用场景, 由于1个上下文结构体是仅对1个请求1个模块而言的, 所以它是低耦合的。 如果这个模块不需要使用上下文, 也可以完全不理会HTTP上下文这个概念
 

2.为什么要有上下文:(epoll原理)epoll详解_致守的博客-CSDN博客

因为Nginx是个强大的全异步处理的Web服务器, 意味着1个请求并不会在epoll的1次调度中处理完成, 甚至可能成千上万次的调度各个HTTP模块后才能完成请求的处理

解疑:

1.Apache服务器:

以Apache服务器为例, Apache就像某些高档餐厅, 每位客人(HTTP请求) 都有1位服务员(一个Apache进程) 全程服务, 每位服务员只有从头至尾服务完这位客人后, 才能去为下一个客人提供服务。 因此餐厅的并发处理数量受制于服务员的数量, 但服务员的数量也不是越多越好, 因为餐厅的固定设施(CPU) 是有限的, 它的管理成本(Linux内核的进程切换成本) 也会随着服务员数量的增加而提高, 最终影响服务质量
 

2.Nginx:

1位服务员同时处理所有客人的需求。 当1位客人进入餐厅后, 服务员首先给它安排好桌子并把菜单给客人后就离开了, 继续服务于其他客人。 当这位客人决定点哪些菜后, 就试图去叫服务员过
来处理点菜需求, 当然, 服务员可能正在忙于其他客人, 但只要一有空闲就会过来拿菜单并
交给厨房, 再去服务于其他客人。 直到厨房通知这位客人的菜已烹饪完毕, 服务员再取来菜
主动地传递给客人, 请他用餐, 之后服务员又去寻找是否有其他客人在等待服务。
 

当1位客人进入Nginx“餐厅”时, 首先是由客人来“激活”Nginx“服务员”的。Nginx“服务员”再次来处理这位客人的请求时, 有可能是因为这位客人点完菜后大声地叫Nginx“服务员”, 等候她来服务,也有可能是因为厨房做好菜后厨师“激活”了这位客人的服务, 也就是说“激活”Nginx“服务员”的对象是不固定的


餐厅的流程是先点菜, 再上菜, 最后收账单以及撤碗盘, 但客人是不想了解这个流程的, 所以Nginx“服务员”需要为每位客人建立上下文结构体来表示客人进行到哪个步骤, 即他点了哪些菜、 目前已经上了哪些菜, 这些信息都需要独立的保存。 “服务员”不会去记住所有客人的“上下文信息”, 因为要同时服务的客人可能很多, 只有在服务到某位客人时才会去查对应的“上下文信息
 

餐厅的流程是先点菜, 再上菜, 最后
收账单以及撤碗盘, 但客人是不想了解这个流程的, 所以Nginx“服务员”需要为每位客人建
立上下文结构体来表示客人进行到哪个步骤, 即他点了哪些菜、 目前已经上了哪些菜, 这些
信息都需要独立的保存。 “服务员”不会去记住所有客人的“上下文信息”, 因为要同时服务的
客人可能很多, 只有在服务到某位客人时才会去查对应的“上下文信息
 

上面说的Nginx“服务员”就像Nginx worker进程, 客人就是一个个请求, 一个Nginx进程同时可以处理百万级别的并发HTTP请求。 厨房这些设施可能是网卡、 硬盘等硬件。 因此, 如果我们开发的HTTP模块会多次反复处理同1个请求, 那么必须定义上下文结构体来保存处理过程的中间状态, 因为谁也不知道下一次是由网卡还是硬盘等服务来激活Nginx进程继续处理这个请求。 Nginx框架不会维护这个上下文, 只能由这个请求自己保存着上下文结构体。


再把这个例子对应到HTTP框架中。 点菜可能是一件非常复杂的事, 因为可能涉及凉菜、 热菜、 汤、 甜品等。 假如HTTP模块A负责凉菜、 HTTP模块B负责热菜、 HTTP模块C负
责汤
。 当一位新客人到来后, 他招呼着服务员(worker进程) 和HTTP框架处理他的点菜需求时(假设他想点2个凉菜、 5个热菜、 1个汤) , HTTP模块A刚处理了1个凉菜, 又有其他客
人将服务员叫走了, 那么, 这个客人处必须有一张纸记录着关于凉菜刚点了一个, 另一张纸
记录着热菜一个没点
, 由于HTTP模块C知道, 当前的餐厅汤已经卖完, 业务实在是太简单了
 所以不需要再有一张纸记录着汤有没有点。 这两张纸只从属于这个客人, 对于其他客人没有意义, 这就是上面所说的, 上下文只是对于一个请求而言。 同时, 每个HTTP模块都可以拥有记录客人(请求) 状态的纸, 这张纸就其实就是上下文结构体。 当这个客人叫来服务员时, 各个HTTP模块可以查看客人身前的两张纸, 了解点了哪些菜, 这才可以继续处理下去

3.使用:

ngx_http_get_module_ctx和ngx_http_set_ctx这两个宏可以完成HTTP上下文的设置和使用。
先看看这两个宏的定义:

#define ngx_http_get_module_ctx(r, module) (r)->ctx[module.ctx_index]
#define ngx_http_set_ctx(r, c, module) r->ctx[module.ctx_index] = c

解析:

1.ngx_http_get_module_ctx接受两个参数, 其中第1个参数是ngx_http_request_t指针, 第2个
参数则是当前的HTTP模块对象

ngx_http_get_module_ctx返回值就是某个HTTP模块的上下文结构体指针, 如果这个HTTP模块没有设置过上下文, 那么将会返回NULL空指针。 因此, 在任何一个HTTP模块中, 都可以使用ngx_http_get_module_ctx获取所有HTTP模块为该请求创建的上下文结构体

2.ngx_http_set_etx接受3个参数,其中第1个参数是ngx_http_request_t指针,第2个参数是准备设置的上下文结构体的指针,第3个参数则是HTTP模块对象。


实践:

//创建上下文结构体
typedef struct {
ngx_uint_t my_step;
} ngx_http_mytest_ctx_t

当请求第1次进入mytest模块处理时, 创建ngx_http_mytest_ctx_t结构体, 并设置到这个请
求的上下文中:

static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t*r)
{// 首先调用ngx_http_get_module_ctx宏来获取上下文结构体ngx_http_mytest_ctx_t* myctx = ngx_http_get_module_ctx(r,ngx_http_mytest_module);// 如果之前没有设置过上下文, 那么应当返回NULLif(myctx==NULL)
{
/*必须在当前请求的内存池r->pool中分配上下文结构体, 这样请求结束时结构体占用的内存才会释放*/myctx = ngx_palloc(r->pool, sizeof(ngx_http_mytest_ctx_t));if(myctx=NULL)
{
return NGX_ERROR;
}
// 将刚分配的结构体设置到当前请求的上下文中ngx_http_set_ctx(r,myctx,ngx_http_mytest_module);
}


 


 

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

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

相关文章

【1】linux命令每日分享——mkdir

大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…

【机器学习】决策树-ID3算法

1.ID3算法 ID3算法利用信息增益进行特征的选择进行树的构建。信息熵的取值范围为0~1,值越大,越不纯,相反值越小,代表集合纯度越高。信息增益反映的是给定条件后不确定性减少的程度。每一次对决策树进行分叉选取属性的时候&#x…

网络计划--时间参数的计算和优化

根据网络图的基本概念和原则绘制出网络图之后,我们可以计算网络图中有关的时间参数,主要目的是找出关键路线,为网络计划的优化、调整和执行提供明确的时间概念。如下图中从始点①到终点⑧共有4条路线,可以分别计算出每条路线所需的…

使用maven搭建父子工程项目

创建父子工程,可以通过父工程来引入jar,定义统一的版本号等。更方便对整个项目的jar包实现统一化管理,让项目的层次更加清晰。一、创建父工程第一步:file–>new–>project–>maven默认使用jdk1.8,不引入任何j…

音视频基础之视频主要概念

视频主要概念 **视频码率:**kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。 **视频帧率:**fps,通常说一个视频的25帧&…

ur3+robotiq ft sensor+robotiq 2f 140配置rviz仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 在安装sensor和gripper之前,先简单配置一下UR机械臂的仿真环境,可参考这篇博…

jenkins下载与简单使用

1.jenkins下载 因为我仍然使用的是jdk1.8进行开发,所以我下载的是jenkins2.332.1版本(jenkins2.346.1版本在2022年末不再支持java8,如果项目使用的是jdk11可以继续使用该jenkins版本),更多版本下载请点击jenkins下载 …

ADRC自抗扰控制总结

目录 前言 1.ADRC形式 1.1形一 1.2形二 2.被控对象 3.仿真分析 3.1仿真模型 3.2仿真结果 4.学习问题 前言 前面的3篇文章依次介绍了微分跟踪器TD、状态观测器ESO和非线性状态误差反馈NLSEF三部分内容,至此ADRC的结构已经介绍完毕,现在对分块学习…

pytorch零基础实现语义分割项目(四)——模型训练与预测

模型训练与预测项目列表前言损失函数one_hotDice LossFocal Loss模型参数与训练预测项目列表 语义分割项目(一)——数据概况及预处理 语义分割项目(二)——标签转换与数据加载 语义分割项目(三)——语义…

JVM系统优化实践(1):JVM概览

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~这是多年之前做过的学习笔记,今天再翻出来,觉得仍然是记忆犹新。「独乐乐不如众乐乐」,就拿出来分享给「众乐乐」吧。目前大多…

用户画像——如何构建用户画像系统

为什么需要用户画像 如果你是用户,当你使用抖音、今日头条的时候,如果平台推荐给你的内容都是你感兴趣的,能够为你节省大量搜索内容的时间。 如果你是商家,当你投放广告的时候,如果平台推送的用户都是你的潜在买家,能够使你花更少的钱,带来更大的收益。 这两者背后都…

KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)

一、漏洞描述 漏洞简述 KeePass 是一款免费的开源密码管理器,可帮助您以安全的方式管理您的密码。您可以将所有密码存储在一个数据库中,该数据库由一把万能钥匙锁定。因此,您只需记住一个主密钥即可解锁整个数据库。数据库文件使用目前已知…

面试个3年自动化测试,测试水平一言难尽。。。。

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。 一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。 看简历很多都是3年工作经验,但…

中间件安全—Apache常见漏洞

中间件安全—Apache常见漏洞1.Apache常见漏洞1.1.Apache介绍1.2.Apache HTTPD 换行解析漏洞(CVE-2017-15715)1.2.1.漏洞介绍1.2.2.漏洞环境1.2.2.1.运行漏洞环境1.2.2.2.访问漏洞环境1.2.3.漏洞复现1.2.3.1.拦截1.2.3.2.添加换行1.2.3.3.访问文件1.3.Apa…

steam搬砖信息差项目,新手1周拿到结果!

项目具体是什么呢? 项目简单概括通过选品软件自动分析出此商品国内外商品价格,计算出利润率,选择出有利润销量好的商品,在以最低价格上架到国内buff的平台里,既能快速的卖出,还能获利。 主要利润在于商品…

在Vue.js中应该避免的三件事

1. 尽量避免使用行内事件代码(inline script) 这是一个行内事件代码 的例子 <div click"alert(hello world); doSomething();" />这种代码虽然第一次写起来很简单&#xff0c;但是很容易出bug。这样做有两个缺点。 VS Code 无法检查行内事件代码的错误 VS …

移动WEB开发五、响应式布局

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

Dubbo之SpringBoot启动源码详解

需要前置知识&#xff0c;了解spring源码&#xff0c;springboot自动加载机制等 DubboBootstrap启动 详细信息可看 学习Dubbo源码需要了解的基础内容源码详解 DubboBootstrap 启动所需要的信息 添加应用程序配置添加注册中心配置添加协议配置添加服务配置启动 SpringBoot启…

音视频基础之音频编码原理简介

一&#xff1a;隐蔽信号 数字音频信号如果不加压缩地直接进行传送&#xff0c;将会占用极大的带宽。例如&#xff0c;一套双声道数字音频若取样频率为44.1KHz&#xff0c;每样值按16bit量化&#xff0c;则其码率为&#xff1a; 244.1kHz16bit1.411Mbit/s 如此大的带宽将给信号…

电商数据查询平台:母婴行业妈妈用品全网热销,头部品牌格局初现

以往&#xff0c;奶粉、纸尿裤这类产品基本就代表了整体母婴市场中的消费品。而如今&#xff0c;随着母婴行业的高速发展和消费升级&#xff0c;母婴商品的种类日益丰富&#xff0c;需求也不断深入。 在京东平台&#xff0c;母婴大品类中除了包含婴童相关的食品&#xff08;奶粉…