由於請求頭過大導致訪問報錯502
nginx錯誤日誌內容
[error] 12917#0: *62380774 upstream sent too big header while reading response header from upstream.
使用者瀏覽器請求到 Nginx 的請求頭帶的資訊太多,超過了 Nginx 設定的大小。有可能是前端設定的Cookie過大、
解決辦法
1、前端儘量使用少量的 Cookie 儲存資料。
2、後臺 Nginx 的 header 大小配置改大。
第一種解決方法需要調整前端程式碼
第二種方法需要在nginx配置檔案的http段新增如下內容:
proxy_buffer_size 128k; proxy_buffers32 32k; proxy_busy_buffers_size 128k;
補充知識
Nginx 預設的 header 長度上限是4k,如果超過了這個值,就會報錯。
如果header頭資訊請求超過了,Nginx 會直接返回400錯誤
可以通過以下2個引數來調整 Nginx 的 header 上限
client_header_buffer_size 16k; large_client_header_buffers 4 16k;
下面講講這兩個引數以及他們之間的關聯關係:
對nginx處理header時的方法:
- 先處理請求的
request_line
,之後才是request_header
。 - 這兩者的
buffer
- 先根據
client_header_buffer_size
配置的值分配一個buffer
,如果分配的buffer
無法容納request_line
/request_header
,那麼就會再次根據large_client_header_buffers
配置的引數分配large_buffer
,如果large_buffer
還是無法容納,那麼就會返回414(處理request_line
)/400(處理request_header
)錯誤。 - 如果你的請求中的
header
都很大,那麼應該使用client_header_buffer_size
,這樣能減少一次記憶體分配。 - 如果你的請求中只有少量請求header很大,那麼應該使用large_client_header_buffers,因為這樣就僅需在處理大header時才會分配更多的空間,從而減少無謂的記憶體空間浪費。
針對get請求,解決請求串過長的問題:
針對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
協議頭中)。