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

首頁(yè) > 網(wǎng)站 > Nginx > 正文

詳解Nginx的配置函數(shù)對(duì)于請(qǐng)求體的讀取

2024-08-30 12:26:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

nginx核心本身不會(huì)主動(dòng)讀取請(qǐng)求體,這個(gè)工作是交給請(qǐng)求處理階段的模塊來(lái)做,但是nginx核心提供了ngx_http_read_client_request_body()接口來(lái)讀取請(qǐng)求體,另外還提供了一個(gè)丟棄請(qǐng)求體的接口-ngx_http_discard_request_body(),在請(qǐng)求執(zhí)行的各個(gè)階段中,任何一個(gè)階段的模塊如果對(duì)請(qǐng)求體感興趣或者希望丟掉客戶端發(fā)過(guò)來(lái)的請(qǐng)求體,可以分別調(diào)用這兩個(gè)接口來(lái)完成。這兩個(gè)接口是nginx核心提供的處理請(qǐng)求體的標(biāo)準(zhǔn)接口,如果希望配置文件中一些請(qǐng)求體相關(guān)的指令(比如client_body_in_file_only,client_body_buffer_size等)能夠預(yù)期工作,以及能夠正常使用nginx內(nèi)置的一些和請(qǐng)求體相關(guān)的變量(比如$request_body和$request_body_file),一般來(lái)說(shuō)所有模塊都必須調(diào)用這些接口來(lái)完成相應(yīng)操作,如果需要自定義接口來(lái)處理請(qǐng)求體,也應(yīng)盡量兼容nginx默認(rèn)的行為。

1,讀取請(qǐng)求體

請(qǐng)求體的讀取一般發(fā)生在nginx的content handler中,一些nginx內(nèi)置的模塊,比如proxy模塊,fastcgi模塊,uwsgi模塊等,這些模塊的行為必須將客戶端過(guò)來(lái)的請(qǐng)求體(如果有的話)以相應(yīng)協(xié)議完整的轉(zhuǎn)發(fā)到后端服務(wù)進(jìn)程,所有的這些模塊都是調(diào)用了ngx_http_read_client_request_body()接口來(lái)完成請(qǐng)求體讀取。值得注意的是這些模塊會(huì)把客戶端的請(qǐng)求體完整的讀取后才開始往后端轉(zhuǎn)發(fā)數(shù)據(jù)。

由于內(nèi)存的限制,ngx_http_read_client_request_body()接口讀取的請(qǐng)求體會(huì)部分或者全部寫入一個(gè)臨時(shí)文件中,根據(jù)請(qǐng)求體的大小以及相關(guān)的指令配置,請(qǐng)求體可能完整放置在一塊連續(xù)內(nèi)存中,也可能分別放置在兩塊不同內(nèi)存中,還可能全部存在一個(gè)臨時(shí)文件中,最后還可能一部分在內(nèi)存,剩余部分在臨時(shí)文件中。下面先介紹一下和這些不同存儲(chǔ)行為相關(guān)的指令:

client_body_buffer_size:設(shè)置緩存請(qǐng)求體的buffer大小,默認(rèn)為系統(tǒng)頁(yè)大小的2倍,當(dāng)請(qǐng)求體的大小超過(guò)此大小時(shí),nginx會(huì)把請(qǐng)求體寫入到臨時(shí)文件中??梢愿鶕?jù)業(yè)務(wù)需求設(shè)置合適的大小,盡量避免磁盤io操作;

client_body_in_single_buffer:指示是否將請(qǐng)求體完整的存儲(chǔ)在一塊連續(xù)的內(nèi)存中,默認(rèn)為off,如果此指令被設(shè)置為on,則nginx會(huì)保證請(qǐng)求體在不大于client_body_buffer_size設(shè)置的值時(shí),被存放在一塊連續(xù)的內(nèi)存中,但超過(guò)大小時(shí)會(huì)被整個(gè)寫入一個(gè)臨時(shí)文件;

client_body_in_file_only:設(shè)置是否總是將請(qǐng)求體保存在臨時(shí)文件中,默認(rèn)為off,當(dāng)此指定被設(shè)置為on時(shí),即使客戶端顯示指示了請(qǐng)求體長(zhǎng)度為0時(shí),nginx還是會(huì)為請(qǐng)求創(chuàng)建一個(gè)臨時(shí)文件。

接著介紹ngx_http_read_client_request_body()接口的實(shí)現(xiàn),它的定義如下:

ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r,  ngx_http_client_body_handler_pt post_handler) 

該接口有2個(gè)參數(shù),第1個(gè)為指向請(qǐng)求結(jié)構(gòu)的指針,第2個(gè)為一個(gè)函數(shù)指針,當(dāng)請(qǐng)求體讀完時(shí),它會(huì)被調(diào)用。之前也說(shuō)到根據(jù)nginx現(xiàn)有行為,模塊邏輯會(huì)在請(qǐng)求體讀完后執(zhí)行,這個(gè)回調(diào)函數(shù)一般就是模塊的邏輯處理函數(shù)。ngx_http_read_client_request_body()函數(shù)首先將參數(shù)r對(duì)應(yīng)的主請(qǐng)求的引用加1,這樣做的目的和該接口被調(diào)用的上下文有關(guān),一般而言,模塊是在content handler中調(diào)用此接口,一個(gè)典型的調(diào)用如下:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 德庆县| 丹棱县| 宁河县| 巴彦淖尔市| 西昌市| 怀仁县| 正蓝旗| 大安市| 望都县| 西和县| 宾川县| 武鸣县| 公安县| 湖州市| 盱眙县| 新竹市| 永泰县| 渝北区| 克什克腾旗| 台东县| 襄垣县| 侯马市| 崇阳县| 扶风县| 竹北市| 安塞县| 阿克苏市| 襄城县| 公安县| 达拉特旗| 临西县| 乌拉特后旗| 新昌县| 肥城市| 静安区| 奉节县| 色达县| 咸阳市| 鄂州市| 乐都县| 乐都县|