1. 程式人生 > >nginx反向代理負載均衡如何解決超長請求串

nginx反向代理負載均衡如何解決超長請求串

 nginx是一個強大的http伺服器,但是在使用過程中發現,當遇到超長post請求或者get請求時,nginx會返回413、400、414等狀態碼,這是因為請求串長度超過了nginx預設的快取大小或者請求串大小,那麼我們需要怎麼樣來解決這些問題呢?
針對POST請求,我們可以調整如下兩個配置項來解決:
client_body_buffer_size 語法:client_body_buffer_size the_size 預設值:8k/16k 使用欄位:http, server, location 這個指令可以指定連線請求使用的緩衝區大小。 如果連線請求超過快取區指定的值,那麼這些請求或部分請求將嘗試寫入一個臨時檔案。
預設值為兩個記憶體分頁大小值,根據平臺的不同,它可能是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
請求工具自己乾的。