upstream design and_implementation_in_nginx

10

Click here to load reader

Upload: monad-bobo

Post on 10-Jun-2015

11.975 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Upstream design and_implementation_in_nginx

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

[email protected]://www.pagefault.info

2012/1/5

Page 2: Upstream design and_implementation_in_nginx

大纲

upstream的简介

upstream模块相关hook

upstream的no buffering与buffering

upstream的no buffering接收

upstream的no buffering发送

资源

  

Page 3: Upstream design and_implementation_in_nginx

Upstream的简介

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

●应用场景○需要后端产生内容

■memcache/fastcgi...○协议

■一发一收■类HTTP

■控制信息都包含在header中,body就是纯粹数据.○  单一server类型

Page 4: Upstream design and_implementation_in_nginx

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

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

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

                                                  upstream的no buffering接收

示意图

Page 8: Upstream design and_implementation_in_nginx

                                                   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

                                                   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

资源

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