-
响应报文接收:
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。
Nginx:HTTP响应发送-下游网速优先
猜你喜欢
转载自blog.csdn.net/u013032097/article/details/91413186
今日推荐
周排行