国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > Nginx > 正文

Nginx丟棄http包體處理實例詳解

2024-08-30 12:25:31
字體:
來源:轉載
供稿:網友

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)實際的丟包處理,也就是接收包體后,直接丟棄。

        從圖中可以看出這三個過程中,丟包流程是一個公共的功能。也就是說不管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; }              
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达日县| 宁化县| 永平县| 上林县| 新河县| 陇南市| 永州市| 兴海县| 苗栗市| 宁波市| 诸城市| 边坝县| 达孜县| 万宁市| 宜章县| 杭锦旗| 禹州市| 和静县| 葫芦岛市| 宿州市| 巨野县| 芮城县| 从江县| 宿州市| 德阳市| 景宁| 澄江县| 贡山| 馆陶县| 崇仁县| 静宁县| 甘孜| 吴忠市| 乐山市| 资溪县| 通州区| 许昌市| 诸城市| 淄博市| 蓝山县| 邵阳市|