AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

Nginx中upstream的设计与实现

发布者 devops
发布于 1434594260430  浏览 5765 关键词 Nginx 
分享到

第1页

Nginx中upstream的设计与实现 (一)

simohayha.bobo@gmail.com http://www.pagefault.info

2012/1/5



第2页

大纲

upstream的简介 upstream模块相关hook upstream的no buffering与buffering upstream的no buffering接收 upstream的no buffering发送 资源



第3页

Upstream的简介

● 什么是upstream ○ upstream是Nginx和后端进行通信的一种机制 ○ Nginx作为一个桥梁 ○ content handle

● 应用场景 ○ 需要后端产生内容 ■ memcache/fastcgi... ○ 协议 ■ 一发一收 ■ 类HTTP ■ 控制信息都包含在header中,body就是纯粹数据. ○ 单一server类型



第4页

upstream模块相关hook

● 编写upstream模块 ○ 回调函数 ■ create_reqeust\reinit_request ■ 创建\重新初始化请求 ■ process_header ■ 处理upstream过来的头 ■ finalize_request ■ 对request进行清理 ■ input_filter/input_filter_init/(upstream) ■ 用于non buffering ■ 将读取的u->buffer拷贝到u->out_bufs ■ input_filter/input_filter_init(event_pipe) ■ 用于buffering



第5页

upstream的no buffering与buffering

● 区别主要是指从后端接收数据,然后发送给client的过程. ● 相同点

○ 都需要接收并解析header完毕之后,才会进入发送流程.

● no buffering ○ 尽量的将从后端接收到的body立即传递给client.

● buffering ○ 会将从后端接收到的body,尽量缓存起来,然后再发送.

 ● subrequest_in_memory ○ body太大导致出错 ○ ngx_http_upstream_process_body_in_memory



第6页

upstream的no buffering header的接收

● ngx_http_upstream_process_header ● xxx_buffer_size 设置读取的header大小.

○ 超过限制,直接出错. ● 流式处理

○ 接收多少处理多少(u->process_header). ● 模块控制header是否结束 ● 处理客户端错误以及后端错误

○ xxx_intercept_errors(默认0) ○ xxx_ignore_client_abort(默认0) ● header的处理 ○ u->headers_in(回调设置)



第7页

                         upstream的no buffering接收 示意图



第8页

                         upstream的no buffering发送

● ngx_http_upstream_send_response ○ 设置r->headers_out ○ 设置u->out_bufs ○ 发送数据

● 发送长度 ○ u->length(u->headers_in.content_len)

● buffer相关 ○ 发送buf(u->out_bufs) ○ 接收buf(u->buffer) ○ buf重用(u->free_bufs) ○ 接收buf与发送buf的连接在u->input_filter ■ 共用数据



第9页

                         upstream的no buffering发送

● 发送数据 ○ ngx_http_upstream_process_non_buffered_request ■ 读写回调都会调用(参数控制) ■ do_write ■ 有读到数据,就发送 ■ body只是纯粹数据 ○ 对于body没有任何拷贝 ○ 结束标记 ■ upstream->read->eof ■ upstream->read->error ■ u->length ○ ○



第10页

● www.nginx.org ● www.pagefault.info ● wiki.nginx.org



资源



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。