欢迎来到站长教程网!

Nginx

当前位置:主页 > 服务器教程 > Nginx >

Nginx扬弃http包体处理惩罚实例详解

时间:2021-05-04|栏目:Nginx|点击:

Nginx扬弃http包体处理惩罚实例详解

http框架扬弃http请求包体和上一篇文章http框架吸收包体, 都是由http框架提供的两个要领,供http各个模块挪用,从而抉择对包体做什么处理惩罚。是选择扬弃照旧吸收,都是由模块抉择的。譬喻静态资源模块,假如吸收到来自欣赏器的get请求,请求某个文件时,则直接返回这个文件内容给欣赏器就可以了。没有须要再吸收包体数据,get请求实际上也不会有包体。因此静态资源模块将挪用http框架提供的扬弃包体函数举办丢包处理惩罚。

        对比吸收包体进程, 扬弃包体操纵就简朴许多了,至少不需要把包体存放到http布局中的request_body缓冲区,也不需要思量包体是否只存放到内存,可能只存放到文件中等问题, 框架吸收完包体后就直接扬弃了。扬弃包体由三部门构成:

        (1) http模块首次挪用框架提供的ngx_http_discard_request_body函数,做些初始化操纵。譬喻假如一次操纵无法扬弃所有包体 ,则需要从头把读事件注册到epoll中,这样再次调治执行时,可以或许继承执行丢包操纵。再者,挪用实际的丢包函数ngx_http_read_discarded_request_body举办扬弃包体操纵。

        (2)假如一次操纵无法扬弃所有包体,则在事件再次被调治时,继承吸收剩余的包体数据,然后扬弃。

        (3)实际的丢包处理惩罚,也就是吸收包体后,直接扬弃。

Nginx抛弃http包体处理惩罚处罚实例详解

        从图中可以看出这三个进程中,丢包流程是一个民众的成果。也就是说不管http模块挪用ngx_http_discard_request_body函数开始举办丢包处理惩罚,照旧一次调治没有吸收完全部包体时,由ngx_http_discarded_request_body_handler认真扬弃剩余的包体操纵, 城市挪用民众的丢包函数ngx_http_read_discarded_request_body举办吸收包体后直接扬弃操纵。

一、丢包初始化流程

        ngx_http_discard_request_body是被http模块挪用,用于扬弃包体的函数。对付模块来讲是一个透明的操纵。也就是说模块只需要挪用这个接口就可以扬弃http请求包体,而不需要知道http框架是如何实现这个接口的。纵使框架一次调治没有扬弃完所有包体,下一次调治执行时会再次举办丢包操纵,但对模块来说,他们是不知道的。

//成果: 扬弃http包体的首次回调函数,假如一次性不能全部吸收完成并扬弃,则配置 
//  读事件的回调为ngx_http_discarded_request_body_handler 
ngx_int_t ngx_http_discard_request_body(ngx_http_request_t *r) 
{ 
 
 //需要扬弃的包体不消思量超时问题 
 if (rev->timer_set) 
 { 
  ngx_del_timer(rev); 
 } 
 
 //包体长度小于便是0,则直接返回。暗示扬弃包体 
 //假如已经吸收过包体了,这时也不需要在吸收。凡是环境下get请求没有包体,因此包体长度为0 
 if (r->headers_in.content_length_n <= 0 || r->request_body) 
 { 
  return NGX_OK; 
 } 
 
 size = r->header_in->last - r->header_in->pos; 
 //已经预先吸收了部门包体 
 if (size) 
 { 
  //包体未全部吸收完成 
  if (r->headers_in.content_length_n > size) 
  { 
   r->header_in->pos += size; 
   r->headers_in.content_length_n -= size; 
 
  } 
  else 
  { 
   //包体已经全部吸收 
   r->header_in->pos += (size_t) r->headers_in.content_length_n; 
   r->headers_in.content_length_n = 0; 
   return NGX_OK; 
  } 
 } 
 
 //配置后续读事件的回调 
 r->read_event_handler = ngx_http_discarded_request_body_handler; 
 
 //注册读事件回调,插入到epoll 
 ngx_handle_read_event(rev, 0)); 
  
 //吸收包体内容 
 if (ngx_http_read_discarded_request_body(r) == NGX_OK) 
 { 
  //暗示已经吸收到完整的包体了,将延迟封锁清0 
  r->lingering_close = 0; 
 
 } 
 else 
 { 
  //暗示需要多次调治才气完成扬弃包体这个操纵,于是把引用计数加1,防备这边在扬弃包体,而其他 
  //事件却已经让请求意外销毁 
  r->count++; 
  //标识为正在扬弃包体 
  r->discard_body = 1; 
 } 
 
 return NGX_OK; 
}  

         在吸收http请求头部时,假如也顺便吸收了http包体数据,这个时候就没有须要继承执行剩余的操纵,扬弃包体乐成,函数直接返回。假如一次调治没有扬弃完所有包体,则会配置http请求布局ngx_http_request_s的读事件read_event_handler为:ngx_http_discarded_request_body_handler, 下一次被调治时由这个函数认真扬弃剩余的包体。因此ngx_http_discard_request_body只会被http模块首次挪用。

        函数也会挪用实际的丢包函数ngx_http_read_discarded_request_body开始举办吸收包体后直接扬弃处理惩罚。

二、丢包处理惩罚 

上一篇:详解Nginx处事器和iOS的HTTPS安详通信

栏    目:Nginx

下一篇:nginx处理惩罚http请求实例详解

本文标题:Nginx扬弃http包体处理惩罚实例详解

本文地址:www.jiaocheng88.com.cn/Nginx/61860.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:584415406 | 邮箱:584415406#qq.com(#换成@)

Copyright © 2015-2020 小白站长教程网 版权所有 苏ICP备20040415号-3