Download - Upstream design and_implementation_in_nginx
![Page 2: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/2.jpg)
大纲
upstream的简介
upstream模块相关hook
upstream的no buffering与buffering
upstream的no buffering接收
upstream的no buffering发送
资源
![Page 3: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/3.jpg)
Upstream的简介
●什么是upstream○ upstream是Nginx和后端进行通信的一种机制○ Nginx作为一个桥梁○ content handle
●应用场景○需要后端产生内容
■memcache/fastcgi...○协议
■一发一收■类HTTP
■控制信息都包含在header中,body就是纯粹数据.○ 单一server类型
![Page 4: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/4.jpg)
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
![Page 5: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/5.jpg)
upstream的no buffering与buffering
●区别主要是指从后端接收数据,然后发送给client的过程.●相同点
○都需要接收并解析header完毕之后,才会进入发送流程.
● no buffering○尽量的将从后端接收到的body立即传递给client.
● buffering○会将从后端接收到的body,尽量缓存起来,然后再发送.
● subrequest_in_memory
○ body太大导致出错○ ngx_http_upstream_process_body_in_memory
![Page 6: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/6.jpg)
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(回调设置)
![Page 7: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/7.jpg)
upstream的no buffering接收
示意图
![Page 8: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/8.jpg)
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
■共用数据
![Page 9: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/9.jpg)
upstream的no buffering发送
●发送数据○ ngx_http_upstream_process_non_buffered_request
■读写回调都会调用(参数控制)■ do_write
■有读到数据,就发送■ body只是纯粹数据
○对于body没有任何拷贝○结束标记
■ upstream->read->eof■ upstream->read->error■ u->length
○○
![Page 10: Upstream design and_implementation_in_nginx](https://reader038.vdocuments.pub/reader038/viewer/2022100601/5578175cd8b42ab40c8b4a93/html5/thumbnails/10.jpg)
资源
●www.nginx.org●www.pagefault.info●wiki.nginx.org