nginx如何解決超長請求串

nginx是一個強大的http服務器,可是在使用過程當中發現,當遇到超長post請求或者get請求時,nginx會返回41三、400、414等狀態碼,這是由於請求串長度超過了nginx默認的緩存大小或者請求串大小,那麼咱們須要怎麼樣來解決這些問題呢?瀏覽器

針對POST請求,咱們能夠調整以下兩個配置項來解決:緩存

client_body_buffer_size服務器

語法:client_body_buffer_size the_sizecookie

默認值:8k/16k工具

使用字段:http, server, locationpost

這個指令能夠指定鏈接請求使用的緩衝區大小。學習

若是鏈接請求超過緩存區指定的值,那麼這些請求或部分請求將嘗試寫入一個臨時文件。google

默認值爲兩個內存分頁大小值,根據平臺的不一樣,它多是8k或16k
 操作系統

client_max_body_size

語法:client_max_body_size size

默認值:client_max_body_size 1m

使用字段:http, server, location

這個指令指定容許客戶端請求的最大的單個文件字節數,它出如今請求頭部的Content-Length字段。

若是請求大於指定的值,客戶端將收到一個"Request Entity Too Large" (413)錯誤。

須要記住,瀏覽器並不知道怎樣顯示這個錯誤。

同時針對post請求還須要注意下面這個參數的配置,若是不打開這個選項當請求串大於client_body_buffer_size大小時,須要手動去讀取存儲在磁盤的請求,這裏須要注意的是存入磁盤的請求是一個完整的請求並非大於client_body_buffer_size的部分

client_body_in_single_buffer

語法:client_body_in_single_buffer

默認值:off

使用字段:http, server, location這個指令(0.7.58版本)指定將一個完整的鏈接請求放入緩衝區,當使用$request_body時推薦使用這個指令以減小複製操做。

若是沒法將一個請求放入單個緩衝區,將會被放入磁盤。

針對get請求,咱們能夠經過修改另外兩個配置來解決請求串超長的問題:client_header_buffer_size 語法:client_header_buffer_size size 默認值:1k 使用字段:http, server 這個指令指定客戶端請求的http頭部緩衝區大小絕大多數狀況下一個頭部請求的大小不會大於1k不過若是有 來自於wap客戶端的較大的cookie它可能會大於1k,Nginx將分配給它一個更大的緩衝區,這個值能夠在 large_client_header_buffers裏面設置。 large_client_header_buffers 語法:large_client_header_buffers number size 默認值:large_client_header_buffers 4 4k/8k 使用字段:http, server 指令指定客戶端請求的一些比較大的頭文件到緩衝區的最大值,若是一個請求的URI大小超過這個值,服務 器將返回一個"Request URI too large" (414),一樣,若是一個請求的頭部字段大於這個值,服務器 將返回"Bad request" (400)。 緩衝區根據需求的不一樣是分開的。 默認一個緩衝區大小爲操做系統中分頁文件大小,一般是4k或8k,若是一個鏈接請求將狀態轉換爲 keep-alive,這個緩衝區將被釋放。

那麼有人就會以爲奇怪了,爲何修改http header的大小就能解決get請求串過長的問題呢, 這就要從http協議的get請求提及了,其實GET提交,請求的數據會附在URL以後(就是把數據放置在 HTTP協議頭中)。

你們看到沒,其實get請求的參數就是存放在http header中的,因此修改header的大小限制 固然能夠解決請求串過長的問題啦。此外還有給你們澄清一點啦,HTTP協議沒有對傳輸的數據大小進行限 制,HTTP協議規範也沒有對URL長度進行限制,咱們平常生活中遇到的長度限制都是各個瀏覽器或者http 請求工具本身乾的。

 

持續學習、持續收穫才能帶來持續的知足和快樂!

轉載於:https://my.oschina.net/u/3367404/blog/1808954