首页 > 资讯 > > 正文

当前速读:Nginx中upstream模块的具体用法

来源:脚本之家 2023-04-04 06:03:04
目录
upstream模块简介upstream模块接口memcached模块分析小结

upstream模块简介

nginx模块一般被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。利用这两类模块,可以使nginx轻松完成任何单机工作。而upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,使它具备了网络应用级别的拆分、封装和整合的功能。数据转发是nginx有能力构建一个网络应用的关键组件。当然,鉴于开发成本的问题,一个网络应用的关键组件一开始往往会采用高级编程语言开发。但是当系统到达一定规模,并且需要更重视性能的时候,为了达到所要求的性能目标,高级语言开发出的组件必须进行结构化修改。

此时,对于修改代价而言,nginx的upstream模块体现出了它的优势,因为它天生就快。作为附带,nginx的配置系统提供的层次化和松耦合使得系统的扩展性也达到比较高的程度。

upstream模块接口

从本质上说,upstream属于handler,只是他不产生自己的内容,而是通过请求后端服务器得到内容,所以才称为upstream(上游)。请求并取得响应内容的整个过程已经被封装到nginx内部,所以upstream模块只需要开发若干回调函数,完成构造请求和解析响应等具体的工作。


(资料图片仅供参考)

upstream模块回调函数列举如下:

函数名称描述
create_request生成发送到后端服务器的请求缓冲(缓冲链),在初始化upstream 时使用
reinit_request在某台后端服务器出错的情况,nginx会尝试另一台后端服务器。 nginx选定新的服务器以后,会先调用此函数,以重新初始化 upstream模块的工作状态,然后再次进行upstream连接
process_header处理后端服务器返回的信息头部。所谓头部是与upstream server 通信的协议规定的,比如HTTP协议的header部分,或者memcached 协议的响应状态部分
abort_request在客户端放弃请求时被调用。不需要在函数中实现关闭后端服务 器连接的功能,系统会自动完成关闭连接的步骤,所以一般此函 数不会进行任何具体工作
finalize_request正常完成与后端服务器的请求后调用该函数,与abort_request 相同,一般也不会进行任何具体工作
input_filter处理后端服务器返回的响应正文。nginx默认的input_filter会 将收到的内容封装成为缓冲区链ngx_chain。该链由upstream的 out_bufs指针域定位,所以开发人员可以在模块以外通过该指针得到后端服务器返回的正文数据。memcached模块实现了自己的 input_filter,在后面会具体分析这个模块。
input_filter_init初始化input filter的上下文。nginx默认的input_filter_init 直接返回

memcached模块分析

memcache是一款高性能的分布式cache系统,得到了非常广泛的应用。memcache定义了一套私有通信协议,使得不能通过HTTP请求来访问memcache。但协议本身简单高效,而且memcache使用广泛,所以大部分现代开发语言和平台都提供了memcache支持,方便开发者使用memcache。nginx提供了ngx_http_memcached模块,提供从memcache读取数据的功能,而不提供向memcache写数据的功能。

upstream模块使用的就是handler模块的接入方式。

同时,upstream模块的指令系统的设计也是遵循handler模块的基本规则:配置该模块才会执行该模块。

那么,upstream模块的特别之处究竟在哪里呢?那就是upstream模块的处理函数,upstream模块的处理函数进行的操作都包含一个固定的流程:(以memcached模块举例,在memcached的处理函数ngx_http_memcached_handler中)

创建upstream数据结构:

ngx_http_upstream_t            *u;
if (ngx_http_upstream_create(r) != NGX_OK) {
    return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
u = r->upstream;

设置模块的tag和schema。schema现在只会用于日志,tag会用于buf_chain管理:

ngx_str_set(&u->schema, "memcached://");
u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;

设置upstream的后端服务器列表数据结构:

mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
u->conf = &mlcf->upstream;

设置upstream回调函数:

u->create_request = ngx_http_memcached_create_request;
u->reinit_request = ngx_http_memcached_reinit_request;
u->process_header = ngx_http_memcached_process_header;
u->abort_request = ngx_http_memcached_abort_request;
u->finalize_request = ngx_http_memcached_finalize_request;
   
u->input_filter_init = ngx_http_memcached_filter_init;
u->input_filter = ngx_http_memcached_filter;

创建并设置upstream环境数据结构:

ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));
if (ctx == NULL) {
    return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
ctx->request = r;

ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);

u->input_filter_ctx = ctx;

完成upstream初始化并进行收尾工作:

r->main->count++;
ngx_http_upstream_init(r);
return NGX_DONE;

任何upstream模块,简单如memcached,复杂如proxy、fastcgi都是如此。
不同的upstream模块在这6步中的最大差别会出现在第2、3、4、5上。

其中第2、4两步很容易理解,不同的模块设置的标志和使用的回调函数肯定不同。第5步也不难理解。

只有第3步是有点费解的,不同的模块在取得后端服务器列表时,策略的差异非常大,有如memcached这样简单明了的,也有如proxy那样逻辑复杂的。

第6步不同模块之间通常是一致的。将count加1,然后返回NGX_DONE。
nginx遇到这种情况,虽然会认为当前请求的处理已经结束,但是不会释放请求使用的内存资源,也不会关闭与客户端的连接。
之所以需要这样,是因为nginx建立了upstream请求和客户端请求之间一对一的关系,在后续使用ngx_event_pipe将upstream响应发送回客户端时,还要使用到这些保存着客户端信息的数据结构。
将upstream请求和客户端请求进行一对一绑定,这个设计有优势也有缺陷。优势就是简化模块开发,可以将精力集中在模块逻辑上,而缺陷同样明显,一对一的设计很多时候都不能满足复杂逻辑的需要。

回调函数:(依然是以memcached模块的处理函数为例)

ngx_http_memcached_create_request:很简单的按照设置的内容生成一个key,接着生成一个“get $key”的请求,放在r->upstream->request_bufs里面。ngx_http_memcached_reinit_request:无需初始化。ngx_http_memcached_abort_request:无需额外操作。ngx_http_memcached_finalize_request:无需额外操作。ngx_http_memcached_process_header:模块的业务重点函数。memcache协议的头部信息被定义为第一行文本,代码如下:
#define LF     (u_char) "\n"
for (p = u->buffer.pos; p < u->buffer.last; p++) {
    if (*p == LF) {
        goto found;
    }
}

如果在已读入缓冲的数据中没有发现LF(‘\n’)字符,函数返回NGX_AGAIN,表示头部未完全读入,需要继续读取数据。nginx在收到新的数据以后会再次调用该函数。

nginx处理后端服务器的响应头时只会使用一块缓存,所有数据都在这块缓存中,所以解析头部信息时不需要考虑头部信息跨越多块缓存的情况。而如果头部过大,不能保存在这块缓存中,nginx会返回错误信息给客户端,并记录error log,提示缓存不够大。

ngx_http_memcached_process_header的重要职责是将后端服务器返回的状态翻译成返回给客户端的状态。例如:

u->headers_in.content_length_n = ngx_atoof(start, p - start);
···
u->headers_in.status_n = 200;
u->state->status = 200;
···
u->headers_in.status_n = 404;
u->state->status = 404;

u->state用于计算upstream相关的变量。比如u->state->status将被用于计算变量“upstream_status”的值。u->headers_in将被作为返回给客户端的响应返回状态码。而u->headers_in.content_length_n则是设置返回给客户端的响应的长度。

在这个函数中一定要在处理完头部信息以后需要将读指针pos后移,否则这段数据也将被复制到返回给客户端的响应的正文中,进而导致正文内容不正确。

ngx_http_memcached_process_header函数完成响应头的正确处理,应该返回NGX_OK。如果返回NGX_AGAIN,表示未读取完整数据,需要从后端服务器继续读取数据。返回NGX_DECLINED无意义,其他任何返回值都被认为是出错状态,nginx将结束upstream请求并返回错误信息。

ngx_http_memcached_filter_init:修正从后端服务器收到的内容长度。因为在处理header时没有加上这部分长度。

ngx_http_memcached_filter:
memcached模块是少有的带有处理正文的回调函数的模块。
因为memcached模块需要过滤正文末尾CRLF “END” CRLF,所以实现了自己的filter回调函数。

处理正文的实际意义是将从后端服务器收到的正文有效内容封装成ngx_chain_t,并加在u->out_bufs末尾。

nginx并不进行数据拷贝,而是建立ngx_buf_t数据结构指向这些数据内存区,然后由ngx_chain_t组织这些buf。这种实现避免了内存大量搬迁,也是nginx高效的原因之一。

小结

以上就是upstream模块的基本组成。upstream模块是从handler模块发展而来,指令系统和模块生效方式与handler模块无异。不同之处在于,upstream模块在handler函数中设置众多回调函数。实际工作都是由这些回调函数完成的。每个回调函数都是在upstream的某个固定阶段执行,各司其职,大部分回调函数一般不会真正用到。upstream最重要的回调函数是ngx_http_upstream_t->create_request、ngx_http_upstream_t->process_header和ngx_http_upstream_t->input_filter,他们共同实现了与后端服务器的协议的解析部分。

到此这篇关于Nginx中upstream模块的具体用法的文章就介绍到这了,更多相关Nginx upstream模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

x
推荐阅读

当前速读:Nginx中upstream模块的具体用法

2023-04-04 06:03:04

【天天播资讯】实盘范文中文模板(汇总3篇)

2023-04-04 02:59:09

中国天化工(00362)拟发行本金额最多为4410万港元的可换股债券

2023-04-03 22:56:27

我喜欢的女人接受我的礼物

2023-04-03 21:19:18

京津冀异地就医打通,患者不再“跑断腿”交材料

2023-04-03 20:01:51

苹果为什么要求微信夜间模式怎么设置(苹果为什么要求微信夜间模式) 当前独家

2023-04-03 19:19:51

全球速讯:江西鄱阳:助农忙春耕,党员勇当先

2023-04-03 18:19:50

全球今头条!《神经病学》:填补空白!科学家发现,女性月经期间偏头痛与激素波动依赖性降钙素基因相关神经肽有关

2023-04-03 17:31:33

2023第二季度天津北辰区公租房接受登记项目房源情况

2023-04-03 16:45:20

4月3日国内盐酸市场行情暂稳

2023-04-03 15:42:54
相关新闻

当前速读:Nginx中upstream模块的具体用法

2023-04-04 06:03:04

【天天播资讯】实盘范文中文模板(汇总3篇)

2023-04-04 02:59:09

中国天化工(00362)拟发行本金额最多为4410万港元的可换股债券

2023-04-03 22:56:27

我喜欢的女人接受我的礼物

2023-04-03 21:19:18

京津冀异地就医打通,患者不再“跑断腿”交材料

2023-04-03 20:01:51

苹果为什么要求微信夜间模式怎么设置(苹果为什么要求微信夜间模式) 当前独家

2023-04-03 19:19:51

全球速讯:江西鄱阳:助农忙春耕,党员勇当先

2023-04-03 18:19:50

全球今头条!《神经病学》:填补空白!科学家发现,女性月经期间偏头痛与激素波动依赖性降钙素基因相关神经肽有关

2023-04-03 17:31:33

2023第二季度天津北辰区公租房接受登记项目房源情况

2023-04-03 16:45:20

4月3日国内盐酸市场行情暂稳

2023-04-03 15:42:54

当前报道:高校校长共话“海洋命运共同体建设”

2023-04-03 15:03:28

“星梦停车棚”化身“敦煌莫高窟”!浦东这个社区展览用艺术激发老旧小区新活力

2023-04-03 14:27:00

双遗币下跌!开盘18元?币商现在报14,但无人问津!

2023-04-03 13:40:59

全省建成加工型马铃薯种植基地10万亩

2023-04-03 12:39:25

毒奶还是现实?明日湖人客战火箭 湖人复仇成功概率高达71.5%|天天快看点

2023-04-03 12:25:48

环球看热讯:“一口”受理,闭环办理!“蜀心办”用心服务,让企业更舒心

2023-04-03 12:05:18

天天速读:鼓浪屿“最美转角”有了新身份

2023-04-03 11:02:10

全球今头条!京津冀专家探讨人工智能机遇挑战

2023-04-03 10:34:45

视点!百济神州(06160)3月31日发行合计95.3万股

2023-04-03 10:25:49

全国各地600家企业亮相新疆暖通展览会_热消息

2023-04-03 09:38:22

世界短讯!水凝膜怎么贴都有气泡(水凝膜怎么贴)

2023-04-03 08:42:25

中信证券:4月推荐配置传媒 消费者服务 电子 房地产 建筑等

2023-04-01 12:06:59

世界今热点:一次罕见的外交攻势,这20个细节很有看头

2023-04-01 09:15:31

WE头脑发昏输给TES!月男已经不能捕获阿水芳心

2023-04-01 07:38:20

全球热推荐:Twitter对外披露部分源代码 包括其推荐算法

2023-04-01 05:46:46

企业微信导出聊天记录失败_企业微信如何导出聊天记录|世界视讯

2023-04-01 02:36:25

40岁放弃创业,我在长白山教白领当木匠

2023-03-31 22:55:43

中国中铁收盘日报:3月31日收盘跌0.86%成交166.08万手 世界百事通

2023-03-31 21:47:03

速递!中国首套高温超导电动悬浮全要素试验系统完成首次悬浮运行

2023-03-31 20:24:19

正安吉他文化产业园入选国家级示范园区

2023-03-31 19:13:59

官宣!合肥铜陵北路下穿合肥东编组站立交工程计划10月通车_天天热门

2023-03-31 17:36:07

*ST宜康:公司已于2022年10月31日、2022年12月28日完成两笔债务重组

2023-03-31 16:59:22

防范“带押过户”风险,实现全流程闭合监管-世界热闻

2023-03-31 15:57:00

以闪亮之名玩呐挑战第六章过关搭配攻略

2023-03-31 15:29:18

柴达木盆地水上雅丹形态万千-每日视点

2023-03-31 14:18:59

今热点:短视频剪辑的步骤

2023-03-31 13:08:26

小羊每天都被薅羊毛全文无防盗(小羊每天都被薅羊毛全文免费阅读)-世界聚焦

2023-03-31 12:13:03

Altair OptiStruct软件介绍

2023-03-31 11:41:49

哈空调:公司2022年度营业收入110,308.82万元,较上年增长29.35% 环球焦点

2023-03-31 10:49:32

欧冠2020赛程比分(欧冠2020赛程)_天天滚动

2023-03-31 10:10:47

1200MW!河南天池抽水蓄能电站最后一台机组转子吊装就位

2023-03-31 08:55:22

给远方亲友的一封信200字_给远方亲友的一封信

2023-03-31 07:50:51

最资讯丨丁香茶的作用和功效是什么(丁香茶的作用和功效是什么呢)

2023-03-31 06:20:28

吃鸡能送什么东西给别人

2023-03-31 06:23:55

中石油去年纯利同比增62.1% 创历史最好经营业绩

2023-03-31 05:03:10

普照寺一品大夫松_对于普照寺一品大夫松简单介绍

2023-03-31 00:41:17

快讯:富国中证军工怎么样?创业板可以加仓了吗?宝盈新价值怎么样?

2023-03-30 22:14:34

每日热讯!买东西更方便了,盒马长沙新增近500个小区可送货上门

2023-03-30 20:56:21

新车报讯:新款福特MustangMach-E谍照曝光车身明显增高/更具跨界气息

2023-03-30 18:54:09

湖人使用本赛季第38套不同的首发阵容 继续领跑全联盟 世界微头条

2023-03-30 17:58:18

每日焦点!油价有望两连跌 95号汽油有望回归7元时代

2023-03-30 17:12:08

英镑兑美元汇率今日预期趋势:看涨(2023/3/30)

2023-03-30 16:33:08

焦点热讯:ETF观察丨“三桶油”去年日赚近10亿元,中国石油股份涨超7%,恒生高股息ETF(513690)涨近1%

2023-03-30 15:31:54

环球快报:丁香油钓鱼怎么用法_丁香油钓鱼效果

2023-03-30 14:59:30

观焦点:十一部门联合发文 地方特色食品产业迎新机遇!超跌+业绩增长的食品股出炉

2023-03-30 13:51:22

初次约会送什么礼物,值得入手礼物攻略 全球时快讯

2023-03-30 12:19:12

郭广昌:2022年复星的确受到很大损失 好在穿过这场风暴

2023-03-30 11:50:32

方萍萍:2023年03月30日原油交易策略

2023-03-30 10:58:11

国家卫健委:进一步加大对开展医疗美容、辅助生殖等服务的医疗机构的抽查力度_世界播资讯

2023-03-30 10:19:56

44岁的他有了人生首张身份证 环球百事通

2023-03-30 09:59:40

热点在线丨福建四区入围全国创新百强区 福州鼓楼区跻身前20

2023-03-30 08:47:16

全球观点:黄茅海跨海通道三主塔顺利封顶 项目预计2024年建成通车

2023-03-30 06:56:48

环球今亮点!网络无法连接互联网是怎么回事_网络无法连接

2023-03-30 05:56:39

宜城市宋玉社区警务室:奏响“枫桥”幸福曲

2023-03-30 01:04:49

次氯酸钙化学式_次氯酸

2023-03-29 22:47:50

【多彩贵州 花漾中国】钟山区:樱花开放报春来|环球微动态

2023-03-29 21:21:33

每日消息!银行门口排队取钱,多数人为啥放弃利息也要取出?看看咋回事?

2023-03-29 20:04:20

全球热头条丨某省摸底PPP项目支出责任及国企、行政事业单位债务情况

2023-03-29 19:29:00

资讯推荐:全球快报:信用卡停息挂账影响征信吗?停息挂账五年后还完就可以吗?

2023-03-29 18:28:46

第一百一十四章 小猫的重新起步

2023-03-29 17:15:30

闺蜜生日礼物推荐100-200元_闺蜜生日礼物推荐 快播报

2023-03-29 16:32:26

观速讯丨24只股涨停 最大封单资金12.02亿元

2023-03-29 15:51:04

【快播报】武鸣沃柑搭乘“水果快线”运至泰国

2023-03-29 14:52:48

龙珠超国语_龙珠改国语

2023-03-29 13:37:40

今日新手如何网上开店(网上开店指南)

2023-03-29 12:34:10

预计投资4亿元 新宙邦拟投建10万吨电池电解液项目

2023-03-29 11:36:19

厦门建发集团10亿中期票据将支付利息 票面利率4.28%

2023-03-29 11:17:26

天天视讯!DODGE STEALTH 可能会回归

2023-03-29 10:12:16

黄金价格持续上涨为哪般?专家解读 世界即时看

2023-03-29 08:10:15

郑州银行(06196.HK):3月28日南向资金增持101.5万股 全球速递

2023-03-29 06:04:28

3月28日基金净值:招商安盈债券A最新净值1.0409,涨0.09%|全球今头条

2023-03-29 02:24:03

天天热门:日记300字左右(日记300字左右大全)

2023-03-28 23:01:17

分机号是什么几位数_分机号是什么 当前速递

2023-03-28 21:37:57

当前快播:南方航空最新公告:2022年净亏损327亿元 拟分拆子公司南航物流上市

2023-03-28 20:12:20

前沿热点:一生之敌!生涯交手7场,约基奇场均22分,命中率50%,恩比德呢?

2023-03-28 19:08:30

尚太科技(001301)3月28日主力资金净买入1189.76万元

2023-03-28 18:27:35

观速讯丨景顺长城旗下基金去年利润亏425亿,700亿大佬刘彦春一人占30%

2023-03-28 17:09:38

澳元兑美元汇率今日预期趋势:看涨(2023/3/28)

2023-03-28 16:13:43

【聚看点】石四药集团(02005)发布年度业绩,净利润11.23亿港元 同比增长约43% 销售收入再创历史新高

2023-03-28 15:39:02

天天滚动:长亮科技:与阿里云于2022年正式达成全面合作

2023-03-28 14:07:46

打通幸福河湖“最后一公里”,“河域党建”做了这些→ 世界新消息

2023-03-28 12:39:54

DeepWay完成7.7亿A+轮融资 累计融资超12亿元_每日动态

2023-03-28 11:01:17

男女通吃的“战损妆”有多绝? 滚动

2023-03-28 10:09:16

海沧区城管局:常态治理不松劲 精细整治再发力-环球快讯

2023-03-28 09:07:45

悦达起亚k5现在价格是多少钱_悦达起亚k5现在多少钱

2023-03-28 07:41:17

全球视讯!沙罗双树的誓言 下载_沙罗双树的誓言

2023-03-28 04:59:02

世界微动态丨北京市今年普通高中招生规模8万人 初三学业水平考6月24日至26日开考

2023-03-28 01:01:33

黑龙江省东宁市:黑木耳成村民致富“金疙瘩” 世界即时

2023-03-27 22:09:58

物业保洁工作计划和总结(物业保洁工作计划)

2023-03-27 20:03:22

74LS160功能表和引脚图_74ls160功能表 热议

2023-03-27 18:57:17