Nginx:HTTP响应发送-下游网速优先

在这里插入图片描述

  • 响应报文接收:
    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。

猜你喜欢

转载自blog.csdn.net/u013032097/article/details/91413186