前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx下游网速优先

Nginx下游网速优先

作者头像
随心助手
发布2019-10-15 11:47:26
2K0
发布2019-10-15 11:47:26
举报
文章被收录于专栏:nginx遇上redisnginx遇上redis

响应报文接收:

ngx_http_upstream_process_non_buffered_request()

n = upstream->recv(upstream, b->last, size);

保存于u->buffer(proxy_buffer_size指令大小)中。

u->free_bufs申请:

1)分配ngx_chain_t;

2)分配ngx_buf_t(cl->buf)。

u->out_bufs创建:

u->input_filter

1)从u->free_bufs中获取ngx_chain_t;

2)将获取到的ngx_chain_t挂在u->out_bufs末尾;

3)将ngx_chain_t->ngx_buf_t中的pos和last指向u->buffer中最新接收的部分;

可以看到,out_bufs中要发送的内容并不是通过拷贝得来,而只是指针指向。

u->out_bufs发送:

ngx_http_upstream_process_non_buffered_request()

调用ngx_http_write_filter。该函数用于发送r->out,所以需要将u->out_bufs放至r->out。

1)分配ngx_chain_t,并将cl->buf指向u->out_bufs中的buf,并将cl挂至r->out末尾。

可以看到,这里只分配了ngx_chain_t,也不存在内容拷贝的过程。

2)调用c->send_chain对r->out进行发送。

3)对于r->out中已经成功发送的ngx_chain_t,对ngx_chain_t进行释放(但其中的ngx_buf_t没有释放,ngx_buf_t还存在u->out_bufs的索引),对应1中的申请。如果r->out没有完全发送,则r->out指向未发送节点。

u->out_bufs回收:

调用ngx_chain_update_chains。

1)为u->busy_bufs赋值为u->out_bufs,u->out_bufs赋值为NULL。

2)遍历u->busy_bufs,通过判断cl->buf的pos和last位置,确定该节点是否被发送。对于已发送节点,将ngx_chain_t(ngx_buf_t未释放)放至u->free_bufs;对于已发送节点,保存在u->busy_bufs

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx遇上redis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档